Как я могу определить, кто устанавливает Cancel в значение true при OnClosing в C # WinForms?

#c# #winforms

#c# #winforms

Вопрос:

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

Проблема в том, что что-то где-то в моем приложении вызывает CancelEventArgs.Для Cancel должно быть установлено значение true, так что Cancel имеет значение true на пути к моей функции OnClosing. Хоть убей, я не могу понять, где это происходит.

Если я посмотрю на стек вызовов в OnClosing, там нет ничего, кроме некоторого внешнего кода и моего Application.Run.

Итак, вопрос в том, как я могу выяснить, кто устанавливает Cancel = true?

Комментарии:

1. Можете ли вы опубликовать какой-нибудь код..

Ответ №1:

Вы хотите сказать, что e.Cancel имеет значение true при вводе OnClosing ?

Одна из возможных причин этого заключается в том, что если Validate метод forms завершается с ошибкой, есть ли у вас какие-либо элементы управления проверкой…

Взгляните в reflector, и вы увидите

 private void WmClose(ref Message m)
{
  blah....
  e.Cancel = !base.Validate(true);
  blah....      
  

Комментарии:

1. Ага. Одним из обходных путей является переопределение OnFormClosing и принудительное e.Cancel = false перед вызовом базового метода.

2. Я мог бы просто установить для Cancel значение false, но это не решает проблему. Позвольте мне проверить validate…… Но да, вы правы, т. е. Cancel имеет значение true при вводе OnClosing.

Ответ №2:

Вы можете запускать свое приложение в режиме отладки и ставить точки останова в каждом операторе Cancel = true.

Приложение остановится в вызванном операторе, и вы сможете увидеть, где это находится.