Является ли значение параметра фреймворка e.Cancel истинным?

#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 .