按钮正在自动关闭WindowsForm
我有一个WinForms应用程序,用于在用户点击取消按钮时检查未决更改。如果有待更改,我会提示用户看看他们是否确定要取消。如果他们这样做,我关闭表格。如果没有,我只是回来。但是,表单正在关闭。经过一些调试后,我意识到这是因为这个特定的按钮被设置为表单的CancelButton
,所以点击它会导致表单关闭。为了验证,我删除了CancelButton
属性,但行为依然存在。按钮正在自动关闭WindowsForm
我该如何防止这种自动关闭?这里是我的事件处理程序代码:
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。
对我的评论跟进做的投入,这是我的一个内部工具,我最近写做:
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();
即可。然后,该事件处理提示并决定是否应该实际关闭。
形式的财产的DialogResult正好被设置为枚举DialogResult.None
....
if (dr == DialogResult.Yes)
{
Close();
}
else
{
this.DialogResult = DialogResult.None;
}
或者干脆:
if (dr != DialogResult.Yes)
this.DialogResult = DialogResult.None;
因为按钮的属性DialogResult的未设置为表单自动关闭DialogResult.None在Forms Designer中。在这种情况下,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
}
}
这很好,谢谢!尽管如此,我正在使用FormClosing解决方案,因为我认为它使事情更具可读性。 – AdamMc331
我建议在'FormClosing'事件而不是'ButtonClick'中进行检查。然后,相应地设置“e.Cancel”。这样,不管关闭你的表单(无论文件 - >退出,右上角的X按钮等)都会提示未保存的更改。 – sab669
您是否正确调试,使用断点和F10?不良行为的原因应该很容易找到。 –
@TobiasKnauss是的,虽然我没有尝试采用这种方法以外的任何其他方法。 – AdamMc331