c#AcceptButton和验证

exM*_*ode 23 c# validation acceptbutton winforms

嗨我有一个包含几个文本框和两个按钮取消和确定的表单.这些按钮被指定为接受和取消表单中的按钮属性.问题是我必须验证在所有文本框中输入的文本.

如果用户单击"确定"按钮(即acceptButton),我想这样做.所以我编写了一个可以进行验证的函数,如果用户单击"确定"按钮,我将触发此函数.问题是即使验证函数返回false,我也无法阻止表单关闭.这是因为我将acceptbutto属性分配给了我的Ok按钮.如果验证失败而没有删除acceptbutton属性,有没有办法防止表单关闭?

Ale*_*lex 32

这是我们使用的工作解决方案(并且它有点从其他答案编译).

你只需要设置的DialogResult,以None防止形成与关闭.

//form init, auto-generated code (this is the case described)
private void InitializeComponent()
{
    //....
    this.AcceptButton = btnOk;
    this.btnOk.DialogResult = DialogResult.OK;
    //....
}

//event handlers
private void btnOK_Click(object sender, EventArgs e)
{
    if (!Validate())
        this.DialogResult = DialogResult.None;
}

private void Form_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.DialogResult == DialogResult.None)
        e.Cancel = true;
}
Run Code Online (Sandbox Code Playgroud)

  • 是否有必要使用FormClosing-EventHandler?对我来说,将DialogResult设置为None就足够了. (6认同)

KMå*_*Mån 6

一种方法是在OnFormClosing事件中应用验证,并根据验证结果取消操作.

- 编辑 -

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.DialogResult == DialogResult.OK)
    {
        if (!IsValid())
        {
            Info("Invalid data");
            e.Cancel = true;
        }
        else
        {
            Info("Valid data found, closing dialog");
        }
    }
    else if (this.DialogResult == DialogResult.Cancel)
    {
        Info("Just cancelling!");
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以打电话this.Close();给取消/确定事件.

或者,在OK按钮实现中,您可以更改DialogResult按钮并将其设置为None;

acceptButton.DialogResult = DialogResult.None;
Run Code Online (Sandbox Code Playgroud)


Vin*_*B R 6

在Ok按钮中单击处理程序将DialogResult更改为DialogResult.None验证失败时


Pat*_*ick 1

不要AcceptButton在表单中设置该属性并DialogResult从按钮中删除该属性(将其设置DialogResult.None为)。

您可以在验证代码中设置表单的 DialogResult 属性。

 if (allFieldsValidated) {
     DialogResult = DialogResult.OK;
 }
Run Code Online (Sandbox Code Playgroud)