При закрытии формы форма проверяет, имеет ли свойство AutoValidate
формы значение, отличное от Disabled
, если if вызывает событие Validating
для сфокусированного элемента управления.Также, если есть какая-либо ошибка проверки (путем установки e.Cancel = true в событии Validating), это предотвращает закрытие формы.
Чтобы предотвратить появление ошибки Validating при закрытии формы, необходимо переопределить WndProc
и перед обработкой WM_CLOSE
сообщения установите AutoValidate
в Disabled
и после этого установите его обратно в исходное значение.Причина возврата его к исходному значению заключается в том, что вы можете запретить закрытие формы, и тогда ожидается, что значение AutoValidate
будет таким же, как изначально было установлено разработчиком:
private const int WM_CLOSE = 0x0010;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_CLOSE)
{
var autoValidate = this.AutoValidate;
this.AutoValidate = AutoValidate.Disable;
base.WndProc(ref m);
this.AutoValidate = autoValidate;
}
else
base.WndProc(ref m);
}
Примечание: Если вы просто хотите, чтобы форма закрывалась после нажатия на кнопку закрытия, достаточно переопределить метод OnClose
и установить e.Cancel = false
.Но это не мешает Validating
событию.Он просто позволяет закрывать форму, даже если в сфокусированном элементе управления есть ошибка проверки.
Подробнее о проблеме можно прочитать в этом посте: Предотвращение создания события проверки целевого элемента управления при закрытииформа .