У меня есть простая форма с одним текстовым полем, плюс кнопки ОК и Отмена. 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.