c#AcceptButton和验证

时间:2010-09-26 11:36:02

标签: c# winforms validation acceptbutton

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

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

5 个答案:

答案 0 :(得分:30)

这是我们使用的工作解决方案(而且它是根据其他答案编写的)。

您只需将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;
}

答案 1 :(得分: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!");
    }
}

您可以在取消/确定事件上致电this.Close();

或者,在“确定”按钮实施中,您可以更改按钮的DialogResult并将其设置为None;

acceptButton.DialogResult = DialogResult.None;

答案 2 :(得分:6)

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

答案 3 :(得分:1)

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

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

 if (allFieldsValidated) {
     DialogResult = DialogResult.OK;
 }

答案 4 :(得分:0)

不要在Designer或其他地方设置Button.DialogResult (不要与Form.DialogResult混淆)。在Button的单击处理程序中执行验证,如果成功将Form.DialogResult设置为DialogResult.OK并关闭表单。

private void OkBtn_Click(object sender, EventArgs e)
{
    if (isValid())
    { 
      this.DialogResult = DialogResult.OK;
      this.Close();
    }
}