我有一个简单的表单,只有一个文本框,以及确定和取消按钮。表单的AcceptButton和CancelButton已正确设置,并且OK和Cancel按钮的DialogResult已分别设置为“OK”和“Cancel”。
我想要在文本框中添加验证功能,当验证失败时防止用户点击OK提交表单,但仍能像往常一样进行取消操作。
所有控件的CausesValidation属性默认为True,但我已将其在取消按钮上更改为False。
确实,单击OK或按Enter键会运行我连接到TextBox的Validating事件。按取消按钮将绕过Validating,这很完美。
然而,按Escape取消表单并不像按取消按钮那样执行相同的操作 - 它会触发Validating事件并阻止用户退出。
是否有办法使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个字符,您也可以按取消按钮或直接关闭表单;但是按Esc键不会产生相同的效果-它会触发验证事件,而应该执行与按Cancel相同的操作。