- 创建一个UserControl,其中包含许多数据绑定子控件,其中没有一个具有验证事件。
- 给UC的根一个验证事件。
- 设置UC的根用户为AutoValidate:Disabled
- 将UC放在主表单上。
- 在主表单上设置UC实例的属性为AutoValidate:Disabled
- 主表单有编辑、保存、取消按钮。只保存调用uc.ValidateChildren().
预期结果:验证函数只在主表单上单击Save时调用。
实际结果:当我在主表单上单击Cancel时,也会调用验证函数。我非常希望它不被调用,因为这是取消按钮的全部意义。
主要问题是:您想要自动验证吗?
◾如果您不想在表单级别进行自动验证:
- 将表单的AutoValidate属性设置为
Disable
,当您在控件之间移动时不会引发Validating
事件。 - 触发验证事件时调用
ValidateChildren
。
◾如果您希望在表单级别进行自动验证,但不希望在单击X按钮或取消按钮时进行验证:
-
设置表单的AutoValidate属性为
EnableAllowFocusChange
。 -
对于取消按钮,请确保您已将CausesValidation属性设置为
false
。 -
要防止在关闭表单时进行验证,请在表单中添加以下代码:
private const int WM_CLOSE = 0x0010; protected override void WndProc(ref Message m) { if (m.Msg == WM_CLOSE) { var autoValidate = this.AutoValidate; this.AutoValidate = AutoValidate.Disable; base.WndProc(ref m); this.AutoValidate = autoValidate; } else base.WndProc(ref m); }
你可能想看看我的帖子在这里了解更多的细节:如何防止验证被触发时,我点击X(关闭按钮)的形式
在我的例子中,修复方法是:
- 设置主表单的根目录到AutoValidate:禁用。仅仅在UC实例上设置这个是不够的。