Как предотвратить запуск проверки при нажатии X (кнопка «Закрыть») в форме - PullRequest
1 голос
/ 20 июля 2010

Это вопрос winform C #.У меня есть текстовое поле с проверяющим прослушивателем событий для проверки содержимого текстового поля.Скажем, текстовое поле не принимает отрицательные значения.Я слушаю только проверяющее событие, поэтому по умолчанию свойство AutoValidate в текстовом поле имеет значение EnablePreventFocusChange, что мне вполне подходит.

Проблема в том, что когда я нажимаю кнопку X в правом верхнем углу формы, яЯ не хочу, чтобы проверка была запущена, потому что я все равно закрываю форму.Как я могу это сделать?Нет никакого контроля, чтобы установить CauseValidation в false, что я могу сделать, если есть кнопка закрытия.Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 20 июля 2010

Хммм, я думаю, что единственный способ сделать это - установить AutoValidate в форме в false и обработать проверку в элементах управления вручную. Форма имеет методы .Validate() и .ValidateChildren(), ознакомьтесь с ними, так как они необходимы для проверки. Чтобы справиться с этим вручную, вам нужно будет прослушивать, когда элемент управления теряет фокус - если проверка не удалась, вам, возможно, придется переориентировать нарушающий элемент управления.

Либо создайте форму ControlBox = false;, чтобы удалить кнопку X.

Обновление: В качестве альтернативы вы также можете использовать переменную-член, чтобы проверить, проверять или нет (т. Е. Закрывается ли форма или нет). Вы не можете сделать это, используя событие FormClosing, так как оно срабатывает после проверки, однако вы можете обнаружить закрытие формы через WndProc. Код предоставлен в этом посте:

http://technoblot.wordpress.com/2006/09/08/winforms-causesvalidation-not-working-a-workaround/

Немного менее сложный обходной путь.

1 голос
/ 24 июля 2015

Я решил эту проблему, установив для свойства свойства CausesValidation значение False. Форма теперь закрывается нормально, когда я нажимаю кнопку X.

0 голосов
/ 28 января 2018

При закрытии формы форма проверяет, имеет ли свойство 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 событию.Он просто позволяет закрывать форму, даже если в сфокусированном элементе управления есть ошибка проверки.

Подробнее о проблеме можно прочитать в этом посте: Предотвращение создания события проверки целевого элемента управления при закрытииформа .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...