代码之家  ›  专栏  ›  技术社区  ›  Steve

如何防止在窗体上单击X(关闭按钮)时触发验证

  •  1
  • Steve  · 技术社区  · 15 年前

    问题是,当我单击窗体右上角的X按钮时,我不希望触发验证,因为我正在关闭窗体。我该怎么做?没有控件将CauseValidation设置为false,如果有关闭按钮,我可以这样做。非常感谢你。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Adam Houldsworth    15 年前

    嗯,我想唯一的办法就是 AutoValidate 在窗体上设置为false并手动处理控件中的验证。表格有 .Validate() .ValidateChildren() 方法,请仔细阅读这些方法,因为它们是执行验证所需的。要手动处理它,您将需要在控件失去焦点时进行监听—如果验证失败,您可能需要重新聚焦有问题的控件。

    或者,制作表单 ControlBox = false; 删除X按钮。

    更新: 或者,您也可以使用成员变量来测试是否验证(即窗体是否关闭)。不能使用 FormClosing 事件,但是您可以通过 WndProc . 本帖提供代码:

    http://technoblot.wordpress.com/2006/09/08/winforms-causesvalidation-not-working-a-workaround/

    稍微少一点的解决方法。

        2
  •  2
  •   lot_styx Reza Aghaei    4 年前

    关闭窗体时,窗体将检查 AutoValidate 窗体的属性的值与 Disabled 然后它提高了 Validating 焦点控制事件。如果存在任何验证错误(通过设置 e.Cancel = true 在验证事件中),它阻止关闭窗体。

    为了防止在关闭窗体时引发验证错误,需要重写 WndProc WM_CLOSE 消息集 自动验证 然后,把它恢复到原来的值。将其设置回原始值的原因是,您可能希望阻止关闭窗体,然后期望它的值为 自动验证 与开发人员最初设置的值相同:

    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);
    }
    

    注: 如果您只想让窗体在单击“关闭”按钮后关闭,就可以覆盖它 OnClosing 方法和集合 e.Cancel = false 打电话后 base.OnClose . 但这并不能阻止 事件。它只允许窗体关闭,即使焦点控件中存在验证错误。

    有关此问题的更多信息,请参阅以下文章: Prevent raising of Validating event of focused control when Closing the form .

        3
  •  1
  •   Waxren    10 年前

    现在,当我单击X按钮时,窗体将正常关闭。

    推荐文章