Закрытие формы от обработчика Загрузок

Решена проблема. Мне нужно было разместить навигацию в подписке на мой входящий вызов:

login-component.ts

...
this.loginForm = this.fb.group({
    username: ['', Validators.required],
    password: ['', Validators.required]
})
...
onSubmit() {
    const formValue = this.loginForm.value;
    if (formValue.username && formValue.password) {
      this.authService.login(formValue.username, formValue.password)
        .subscribe(
          resp => { 
              console.log(resp);
              this.router.navigateByUrl('/registration'); 
          },
          err => { console.log(err); }
        )
    }
  }
8
задан Breeze 17 June 2016 в 08:22
поделиться

6 ответов

В событии load не очень хорошая идея закрыть форму. Сделайте это после Активированного события.

3
ответ дан 5 December 2019 в 04:35
поделиться

Хорошо, не хочу отвечать на мой собственный вопрос, но это сводило меня с ума, и это была одна из самых сложных ошибок для воспроизведения, которую я когда-либо видел.

В своей форме я переопределяю методы OnFormLoad и OnFormClose, где я сохраняю / восстанавливаю размер формы, местоположение и WindowState в / из реестра. Я взял этот код, и он решил проблему. Странно то, что я отложил это, и проблема не вернулась.

Я наконец воспроизвел проблему: вы должны позволить форме полностью открыться, развернуть ее, а затем закрыть, чтобы сохранить состояние «Развернуто» в реестр. Затем, когда вы снова откроете его, он установит его на Maximized, и если он закрывается в обработчике загрузки, он пытается получить доступ к размеру / расположению при закрытии. Видимый доступ к этим значениям в методе OnFormClosing заставляет форму пытаться сфокусироваться, ЕСЛИ И ТОЛЬКО ЕСЛИ форма развернута, что недопустимо, так как форма была удалена.

Таким образом, в основном, вы не можете получить доступ к свойствам отображения формы в метод OnFormClosing формы, если эта форма будет вызывать Close из своего события Load.

6
ответ дан 5 December 2019 в 04:35
поделиться

Одна возможность:

У них может быть таймер в этой форме, который инициализируется и включается в их FormLoad событие. Таймер также должен быть отключен и остановлен, прежде чем форма будет закрыта, если таймер пытается получить доступ к форме при ее запуске.

Я видел формы до того, как это сделать ...

1
ответ дан 5 December 2019 в 04:35
поделиться

Мне кажется, что если не присматриваться к нему, то самым чистым способом достижения желаемого может быть создание пользовательского класса формы, производного от Form , и переопределение OnFormLoad (...

0
ответ дан 5 December 2019 в 04:35
поделиться

Вы пробовали войти в код .net, чтобы увидеть, какая строка кода вызывается при возникновении исключения? Если у вас VS 2008, вы можете сделать это, перейдя в Инструменты -> Параметры -> Отладка и выбрав Включить степпинг исходного кода .NET Framework. Имейте в виду, что загрузка всех необходимых файлов может занять некоторое время, но таким образом вы можете войти в form.Show () и точно увидеть, что происходит.

0
ответ дан 5 December 2019 в 04:35
поделиться

Хорошо, оказывается, это немного Проще и более универсально, чем я думал, но все же странно и неясно.

Если вы сохраняете / загружаете форму Size / Location / WindowState, когда форма загружается / закрывается, как мы, вы должны убедиться, что метод OnLoad сначала вызывает base.OnLoad, чтобы сработал обработчик события Form Load, а затем установите свойства. Невыполнение этого требования вызовет проблему, только если форма вызывает метод Close из метода Load. Вы получите ObjectDisposedException при вызове Show после завершения события закрытия формы.

У меня болит голова.

0
ответ дан 5 December 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: