Закрытие формы из обработчика загрузки - PullRequest
8 голосов
/ 08 апреля 2009

У меня очень странное поведение, которое, кажется, происходит только в одной форме.

В основном я создаю экземпляр Form и вызываю Show(), чтобы отобразить неблокирующую форму. В обработчике событий Load этой формы у меня есть логика, которая может вызывать this.Close() при определенных обстоятельствах. Это закрывает форму, но затем метод Show() в коде клиента выдает ObjectDisposedException.

Трассировка стека из исключения ObjectDisposedException выглядит следующим образом:

в System.Windows.Forms.Control.CreateHandle ()
в System.Windows.Forms.Form.CreateHandle ()
в System.Windows.Forms.Control.get_Handle ()
в System.Windows.Forms.ContainerControl.FocusActiveControlInternal ()
в System.Windows.Forms.Form.SetVisibleCore (логическое значение)
в System.Windows.Forms.Control.Show ()
... и т.д.

Вот что я вижу:

  1. Control.Show() называется
  2. моя форма запущена
  3. метод OnFormLoad называется
  4. вызывается обработчик события FormLoad, внутри которого я вызываю this.Close()
  5. метод OnFormClosing называется
  6. обработчик события FormClosing называется
  7. Dispose вызывается в моей форме и все его пользовательские элементы управления

и затем где-то ближе к концу Control.Show() метода, он пытается получить дескриптор формы, который приходит в ужас и выдает исключение, потому что объект помечен как удаленный.

Мой реальный вопрос: почему я могу делать это точно так же в любой другой форме, которая у меня есть, без исключений? Это проблема GC? Я попытался сделать GC.Collect() вызов сразу после this.Close(), и это не имеет значения. Как я уже сказал, это происходит в этой форме 100% времени, и нигде больше, независимо от дочерних пользовательских элементов управления, области видимости переменной формы и т. Д.

Есть идеи?

Ответы [ 11 ]

0 голосов
/ 08 апреля 2009

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

Тем не менее, я не знаю, почему это сработало бы иногда, а не иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...