Является ли настройка фреймворка e.Cancel истинной? - PullRequest
1 голос
/ 04 мая 2011

Я пишу приложение для Windows Forms (фреймворк 2.0) и сталкиваюсь со странной ошибкой.

В моей форме, когда генерируется конкретное исключение, у меня есть блок catch, который должен регистрировать ошибку, информировать пользователя с помощью диалогового окна, а затем закрыть форму, вызвав this.Close (). Первые два шага работают нормально, но this.Close () ничего не делает. Сначала я подумал, что у меня должен быть обработчик событий, который устанавливает для e.Cancel значение true, но после тщательной проверки кода я не смог его найти. Кроме того, я не переопределил метод OnCancel формы.

В процессе поиска ошибки я написал переопределение метода OnCancel формы и установил в нем точку останова. В начале OnCancel e.Cancel уже имеет значение true. Если мое понимание верно, переопределение должно выполняться перед любыми обработчиками событий, так что, похоже, исключается возможность возникновения этой проблемы из-за обработчика событий, который я как-то пропустил.

В моем методе переопределения OnClosing, если я установил для e.Cancel значение false, форма закрывается нормально, и моя программа работает так, как я и предполагал, но я не хочу исправлять это таким образом. Очевидно, есть некоторый код, который создает неожиданный побочный эффект, и я хочу понять, что происходит, а не прибегать к «цифровой клейкой ленте».

Кажется, сама структура отменяет закрытие моей формы. Существуют ли ситуации, когда фреймворк сделает это?

Спасибо.

редактировать ...

Я создал небольшой тестовый проект и смог воссоздать ошибку в гораздо более простой форме.

Если вы хотите воссоздать ситуацию, чтобы вы могли понять, что я имею в виду, попробуйте это ... Создайте форму и добавьте текстовое поле (я предполагаю, что другие элементы управления тоже будут работать). Пусть ваша форма обработает событие Validated текстового поля, а в обработчике вызовет this.Close. Теперь переопределите Form.OnClosing () и установите в нем точку останова.

Теперь запустите программу, введите текст и табуляцию из текстового поля, чтобы оно подтвердило (я думаю, вы захотите добавить кнопку или что-то еще, чтобы у вас был какой-то другой элемент управления для табуляции.)

В начале OnClosing e.Cancel будет автоматически установлен в true Это то, что я пытаюсь выяснить. Почему это происходит?

Ответы [ 3 ]

1 голос
/ 24 апреля 2012

У меня точно такой же сценарий в Framework 2.0.Если происходит определенный набор событий, следующий код будет останавливаться на точке останова на 3-й строке этого подпрограммы каждый раз после этого, независимо от того, что еще происходит в приложении.

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

Если это самый низкий метод в системедля события закрытия формы заявки, тогда что еще может устанавливать для e.Cancel значение true, кроме фреймворка?

Protected Overrides Sub OnFormClosing(e As System.Windows.Forms.FormClosingEventArgs)
  If e.Cancel Then
    e.Cancel = False
  End If
  MyBase.OnFormClosing(e)
End Sub
0 голосов
/ 04 мая 2011

Ваш вопрос совершенно неясен. Вы ссылаетесь на метод OnCancel, однако в классе Form такого метода не существует. Вы используете .NET 2.0 в соответствии с первым предложением в вашем вопросе, однако вы переопределяете Form.OnClosing. Обратите внимание, что этот метод устарел с версии 2.0 платформы. Вместо этого следует использовать Form.OnFormClosing , новый с 2.0. Пожалуйста, попробуйте переопределить этот метод вместо этого и посмотреть, если вы наблюдаете ту же проблему. Я, конечно, никогда не видел такой вещи из OnFormClosing.

0 голосов
/ 04 мая 2011

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

Однако очень легко определить, отменяет ли какой-либо обработчик событий: просто используйте отладчик! Пройдите по коду и посмотрите, что произойдет.

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

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