即使 UC 的设计和 UC 的实例上的自动验证都设置为禁用,也会调用用户控件验证函数


  1. 创建一个UserControl,其中包含许多数据绑定子控件,其中没有一个具有验证事件。
  2. 给UC的根一个验证事件。
  3. 设置UC的根用户为AutoValidate:Disabled
  4. 将UC放在主表单上。
  5. 在主表单上设置UC实例的属性为AutoValidate:Disabled
  6. 主表单有编辑、保存、取消按钮。只保存调用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(关闭按钮)的形式

在我的例子中,修复方法是:

  1. 设置主表单的根目录AutoValidate:禁用。仅仅在UC实例上设置这个是不够的。

最新更新