Я пишу приложение для 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 Это то, что я пытаюсь выяснить. Почему это происходит?