#c# #windows #forms
#c# #Windows #формы
Вопрос:
Я пишу приложение Windows Forms (платформа 2.0), и я сталкиваюсь со странной ошибкой.
В моей форме, когда генерируется конкретное исключение, у меня есть блок catch, который должен регистрировать ошибку, информировать пользователя с помощью диалогового окна, а затем закрывать форму, вызывая это.Закрыть(). Первые два шага работают нормально, но это.Close() ничего не делает. Моей первой мыслью было, что у меня должен быть обработчик событий, который устанавливает значение e.Cancel в значение true, но после тщательной проверки кода я не смог его найти. Кроме того, я не переопределил метод onCancel формы.
В процессе попытки отследить ошибку я написал переопределение для метода onCancel формы и установил в нем точку останова. В начале onCancel значение e.Cancel уже равно true. Если я правильно понимаю, переопределение должно выполняться перед любыми обработчиками событий, так что, похоже, это исключает возможность того, что эта проблема вызвана обработчиком событий, который я каким-то образом пропустил.
В моем методе переопределения при включении, если я устанавливаю e.Cancel значение false, форма закрывается нормально, и моя программа работает так, как я задумал, но я не хочу исправлять это таким образом. Очевидно, что какой-то код создает неожиданный побочный эффект, и я хочу понять, что происходит, а не прибегать к «цифровой клейкой ленте».
Похоже, что сам фреймворк отменяет закрытие моей формы. Существуют ли какие-либо ситуации, когда фреймворк мог бы это сделать?
Спасибо.
Редактировать…
Я создал небольшой тестовый проект и смог воссоздать ошибку в гораздо более простой форме.
Если вы хотите воссоздать ситуацию, чтобы вы могли понять, что я имею в виду, попробуйте это… Создайте форму и добавьте текстовое поле (я предполагаю, что другие элементы управления тоже будут работать). Пусть ваша форма обработает событие проверки текстового поля и вызовет это внутри обработчика.Закрыть. Теперь переопределите форму.Включите Closing() и установите в нем точку останова.
Теперь запустите программу, введите некоторый текст и выведите табуляцию из текстового поля, чтобы она подтвердилась (я думаю, вы захотите добавить кнопку или что-то еще, чтобы у вас был какой-то другой элемент управления для табуляции.)
В начале включения значение e.Cancel будет автоматически установлено в значение true, это то, что я пытаюсь выяснить. Почему это происходит?
Комментарии:
1. Возможно, это «как задумано». Вы указываете форме отменить операцию закрытия, потому что вы закроете ее, когда будете готовы (или, возможно, нет).
Ответ №1:
У меня точно такой же сценарий в 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
Ответ №2:
Я не уверен, что вы просите нас угадать, правильный ли ваш код или что именно. Могу сказать вам, что я никогда не сталкивался с этой проблемой.
Однако определить, отменяется ли какой-либо обработчик событий, до боли просто: просто используйте отладчик! Пройдитесь по коду и посмотрите, что получится.
Учитывая небольшое количество деталей, которые вы здесь предоставили, я думаю, что ваше внимание должно быть сосредоточено на выяснении того, что происходит.
Комментарии:
1. Извините за путаницу. Я попытаюсь сформулировать свой вопрос более четко. Я использовал отладчик, и я определил, что нет никаких обработчиков событий, которые его отменяют, но я все еще пытаюсь выяснить, что происходит. Как говорилось в моем первоначальном сообщении, я добавил переопределение OnClosing () и установил в нем точку останова. Странно то, что e.Cancel уже имеет значение true в начале OnClosing(). Трассировка стека не помогает, потому что она просто говорит [Внешний код]. Мой вопрос в том, существуют ли какие-либо обстоятельства, при которых фреймворк должен автоматически отменять закрытие формы?
2. Ну, я не знаю, что происходит, но что бы я сделал, так это пошагово просматривал каждую строку кода, из которой вы вызываете метод close. В фреймворке может быть что-то, что предотвращает это, но я не могу знать, что это может быть. В конце концов, вы даже не показали свой код!
Ответ №3:
Ваш вопрос совершенно неясен. Вы ссылаетесь на метод, OnCancel
однако в Form
классе такого метода не существует. Вы используете .NET 2.0 в соответствии с первым предложением в вашем вопросе, однако вы переопределяете Form.OnClosing
. Обратите внимание, что этот метод устарел начиная с версии 2.0 фреймворка. Вы должны использовать форму.Вместо этого OnFormClosing новое с версии 2.0. Пожалуйста, попробуйте переопределить этот метод вместо этого и посмотрите, наблюдаете ли вы ту же проблему. Я, конечно, никогда не видел такой вещи от OnFormClosing
.