WinForms Validating event предотвращает закрытие формы клавишей Escape

У меня есть простая форма с одним текстовым полем, плюс кнопки ОК и Отмена. AcceptButton и CancelButton формы установлены правильно, а для кнопок OK и Cancel для DialogResult задано значение «OK» и «Отмена».

Я хочу добавить проверку в TextBox, которая не позволит пользователю ОК-вводить форму при сбое проверки, но это также позволит им отменить как обычно.

Свойство CausesValidation по умолчанию имеет значение True для всех элементов управления, но я изменил это значение на False на кнопке Cancel.

Разумеется, щелчок OK или нажатие клавиши Enter запустит событие Validating, которое я подключил к TextBox. Нажатие кнопки отмены обходит проверку, что идеально.

Однако нажатие Escape для отмены формы , а не выполняет то же самое, что нажатие кнопки отмены - вызывает событие проверки и предотвращает выход пользователя .

Есть ли способ заставить клавишу Escape работать так, как задумано, то есть не вызывать событие Validating, как если бы была нажата кнопка Отмена?

Полное рабочее решение:

Создание новой Windows Приложение Forms. Добавьте в проект вторую форму.

Вставьте этот код в конструктор Form1 после InitializeComponent ():

MessageBox.Show((new Form2()).ShowDialog().ToString());

Это показывает DialogResult, переданный обратно из нашей второй формы.

Вставьте этот код в конструктор Form2 после InitializeComponent ():

TextBox txtName = new TextBox();

txtName.Validating +=
    new CancelEventHandler((sender, e) =>
    {
        if (txtName.Text.Length == 3)
        {
            MessageBox.Show("Validation failed.");
            e.Cancel = true;
        }
    });

Button btnOk = new Button
{
    Text = "OK",
    DialogResult = DialogResult.OK
};
Button btnCancel = new Button
{
    Text = "Cancel",
    CausesValidation = false,
    DialogResult = DialogResult.Cancel
};
FlowLayoutPanel panel = new FlowLayoutPanel();
panel.Controls.AddRange(new Control[] 
{
    txtName, btnOk, btnCancel 
});

this.AcceptButton = btnOk;
this.CancelButton = btnCancel;

this.Controls.Add(panel);

В этом упрощенном примере текстовое поле не позволит вам продолжить, если введено 3 символа. Вы можете нажать кнопку Отмена или закрыть форму напрямую, даже если присутствует 3 символа; однако нажатие клавиши Escape , а не делает то же самое - запускает событие Validating, тогда как оно должно делать то же самое, что и нажатие Cancel.

13
задан Dave R. 26 January 2011 в 12:52
поделиться