我使用C#。
我有一个带有编辑框和取消按钮的Windows表单。编辑框在验证事件中有代码。每当编辑框失去焦点时,该代码都会被执行。当我点击取消按钮时,我只想关闭表单,而不想执行任何对编辑框的验证。如何实现这一点?
这里有一个重要的细节:如果验证失败,则
这里有一个重要的细节:如果验证失败,则
e.Cancel = true;
防止控件被离开。
但是当用户点击取消按钮时,无论如何都应该关闭表单。如何实现?
e.Cancel = true;
防止控件被离开。
但是当用户点击取消按钮时,无论如何都应该关闭表单。如何实现?
BtnCancel
的MouseEnter
设置CausesValidation=false
(也没有起作用)。 - Tim SchmelterCausesValidation
设置为false
将阻止这种情况发生。答案会让人误以为先进行验证,然后取消按钮才起作用,而实际上根本没有进行任何验证。 - Imperishable Night显然,必须将按钮的CausesValidation
属性设置为false,这样在点击它时验证事件就不会发生。但是,如果按钮的父控件的CausesValidation
属性设置为true,则此方法可能失败。大多数情况下,开发人员会忘记更改容器控件(例如面板控件)的CausesValidation
属性。也要将其设置为False。这样应该就可以解决问题了。
CausesValidation
设置为 False
。 - Mark RansomFalse
,还是只需要设置我的按钮的直接父容器? - dotNET我的表单一直关闭不了,因为某些控件的验证会阻止表单关闭。我已经为取消按钮及其所有父级设置了control.CausesValidation = false
,但问题仍然存在。
似乎如果用户正在编辑一个使用验证功能的字段,并决定放弃(使该字段的输入无效),则取消按钮事件将被触发,但窗口不会关闭。
以下是在取消按钮点击事件中解决此问题的方法:
private void btnCancel_Click(object sender, EventArgs e)
{
// Stop the validation of any controls so the form can close.
AutoValidate = AutoValidate.Disable;
Close();
}
将“CausesValidation”属性设置为“false”,以取消按钮的验证功能。
这些答案都不完全解决问题,但此帖子中的最后一个答案可以。基本上,您需要:
Override this virtual method.
protected override bool ProcessDialogKey(Keys keyData) {
if (keyData == Keys.Escape) {
this.AutoValidate = AutoValidate.Disable;
CancelButton.PerformClick();
this.AutoValidate = AutoValidate.Inherit;
return true;
}
return base.ProcessDialogKey(keyData);
}
将CausesValidation
属性设置为false
。
将CausesValidation设置为false是关键,但仅此还不够。如果按钮的父级已将CausesValidation设置为true,则仍会调用验证事件。在我的一个案例中,我在表单上的面板上放置了一个取消按钮,因此我必须在面板和表单上都将CausesValidation设置为false。最终,我以编程方式执行此操作,因为这比浏览所有表单更简单...
Control control = cancelButton;
while(control != null)
{
control.CausesValidation = false;
control = control.Parent;
}
if (btnCancel.focused)
{
return;
}