24

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

如果用户单击确定按钮(即acceptButton),我想这样做。所以我写了一个负责验证的函数,如果用户点击 Ok 按钮,我会触发这个函数。问题是即使验证函数返回 false,我也无法阻止表单关闭。发生这种情况是因为我将 acceptbutto 属性分配给了我的 Ok 按钮。如果验证失败而不删除acceptbutton属性,有什么方法可以防止表单关闭?

4

5 回答 5

35

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

您只需将 设置DialogResultNone以防止表单关闭。

//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;
}
于 2011-06-28T12:02:20.357 回答
8

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

于 2010-09-26T11:48:32.037 回答
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();Cancel/Ok 事件。

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

acceptButton.DialogResult = DialogResult.None;
于 2010-09-26T11:45:36.657 回答
1

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

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

 if (allFieldsValidated) {
     DialogResult = DialogResult.OK;
 }
于 2010-09-26T11:44:39.493 回答
1

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

private void OkBtn_Click(object sender, EventArgs e)
{
    if (isValid())
    { 
      this.DialogResult = DialogResult.OK;
      this.Close();
    }
}
于 2015-05-10T10:41:38.357 回答