Button正在自动关闭WindowsForm

时间:2015-09-04 17:50:39

标签: c# winforms

我有一个WinForms应用程序,只要用户点击取消按钮就会检查挂起的更改。如果有待更改,我会提示用户确定他们是否确定要取消。如果他们这样做,我关闭表格。如果没有,我只是回来。但是,表格正在关闭。经过一些调试后,我意识到这是因为这个特定的按钮被设置为表格的CancelButton,所以点击它会导致表格关闭。为了验证,我删除了CancelButton属性,但行为仍然存在。

如何防止这种自动关闭?这是我的事件处理程序代码:

private void closeButton_Click(object sender, EventArgs e)
{
    DialogResult dr = DialogResult.Yes;

    if (changesMade)
    {
        dr = MessageBoxEx.Show(this, "Are you sure you wish to disregard the changes made?", "Changes Made", MessageBoxButtons.YesNo);
    }

    if (dr == DialogResult.Yes)
    {
        Close();
    }
    else
    {
        //TODO:
    }
}

在上面的代码中,只有在没有进行任何更改或者用户选择忽略它们时,表单才应该关闭。我做了更改,并在DialogBox上单击“否”,但表单仍然关闭。使用和不使用按钮设置为表单的CancelButton。

2 个答案:

答案 0 :(得分:3)

只需将表单的属性DialogResult设置为enum DialogResult.None

....
if (dr == DialogResult.Yes)
{
    Close();
}
else
{
    this.DialogResult = DialogResult.None;
}

或简单地说:

if (dr != DialogResult.Yes)
   this.DialogResult = DialogResult.None;

表单自动关闭,因为该按钮的属性DialogResult未在Forms Designer中设置为DialogResult.None。在这种情况下,WinForms引擎获取该值并将其分配给整个表单的DialogResult属性,使其自动关闭。这通常用在表单的调用代码中,以区分确认和取消按钮

在下面的示例中,假设在frmCustomers上有两个按钮,一个将DialogResult属性设置为DialogResult.OK,另一个设置为DialogResult.Cancel。现在,如果用户点击OK按钮,您可以在调用代码中了解如何处理新客户的输入

using(frmCustomers f = new frmCustomers())
{
    if(f.ShowDialog() == DialogResult.OK)
    {
       // Execute code to save a customer
    }
}

答案 1 :(得分:1)

跟进我的评论,这就是我为最近写的内部工具所做的事情:

private void Form_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = !PromptUnsavedChanges();
}

private bool PromptUnsavedChanges()
{
    if (HasFormChanged()) //checks if form is different from the DB
    {
        DialogResult dr = MessageBox.Show("You have unsaved changes. Would you like to save them?", "Unsaved Changes", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

        if (dr == System.Windows.Forms.DialogResult.Yes)
            tsmiSave_Click(null, null); // Saves the data
        else if (dr == System.Windows.Forms.DialogResult.Cancel)
            return false; // Cancel the closure of the form, but don't save either
    }

    return true; // Close the form
}

从可读性的角度来看,逻辑可能已经清理干净了,现在几个月后我才会看到它。但它确实有效。

有了这个,您只需在按钮点击事件中调用this.Close();即可。然后该事件处理提示并决定它是否应该实际关闭。