У меня есть простая форма с одним текстовым полем, плюс кнопки "ОК" и "Отмена" . Форма AcceptButton и CancelButton установлены правильно, а кнопки "ОК" и "Отмена" имеют свой диалог DialogResult для "ОК" и "Отмена" .
Я хочу добавить валидацию в TextBox, которая не позволит пользователю очистить форму, когда проверка не удалась, но которая также позволит им отменить, как обычно.
Свойство CausesValidation True по умолчанию для всех элементов управления, но я изменил его на False на кнопке Cancel.
Конечно, нажав ОК или нажав клавишу Enter, будет запущено событие проверки, которое я подключил к TextBox. Нажатие кнопки "Отмена" обходит "Проверка", которая идеально подходит.
Однако нажатие Escape для отмены формы делает не выполнение так же, как нажатие кнопки "Отмена" - это вызывает событие проверки и предотвращает выход пользователя.
Есть ли способ заставить клавишу Escape выполнять, как предполагалось, то есть не поднимать событие проверки, как если бы была нажата кнопка "Отмена" ?
Полностью обработанное решение:
Создайте новое приложение 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 будет не делать то же самое - оно запускает событие проверки, тогда как оно должно делать то же самое, что нажатие Cancel.