我有一个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。
答案 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();
即可。然后该事件处理提示并决定它是否应该实际关闭。