当退出程序时,如果程序员处理FormClosing
事件,如果有未保存的数据,程序员可以提示保存对话框询问他们是否要保存,不保存或取消操作。
在FormClosing事件中,如果他们点击Cancel
,要取消您设置e.Cancel = true;
的操作。这可以。但是,如果用户点击Exit
按钮,则会在菜单中显示相同的内容,除了执行e.Cancel = true;
之外,它应该只执行return;
,因为它处理菜单项Click
事件而不是FormClosing
事件。
现在我几乎已经重复了代码,并且想知道是否有办法处理这个以避免以优雅和可理解的方式重复。
private void FrmEditorFormClosing(object sender, FormClosingEventArgs e)
{
if (NeedsToSave)
{
DialogResult saveChangesDialog =
MessageBox.Show("There are unsaved changes. Save now?",
"Xml Editor", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (saveChangesDialog == DialogResult.Yes)
{
Save();
}
else if (saveChangesDialog == DialogResult.Cancel)
{
e.Cancel = true; // Only difference
}
}
}
private void ExitToolStripMenuItemClick(object sender, EventArgs e)
{
if (NeedsToSave)
{
DialogResult saveChangesDialog =
MessageBox.Show("There are unsaved changes. Save now?",
"Xml Editor", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (saveChangesDialog == DialogResult.Yes)
{
Save();
}
else if (saveChangesDialog == DialogResult.Cancel)
{
return; // Only difference
}
}
Close();
}
答案 0 :(得分:3)
你不应该这样做。在菜单单击处理程序中调用Close将导致FormClosing事件触发,您可以在那里取消它。
答案 1 :(得分:1)
将公共代码放在一个返回 bool 的方法中,以指示是否发生了保存
private bool PromptSave()
{
if (NeedsToSave)
{
DialogResult saveChangesDialog =
MessageBox.Show("There are unsaved changes. Save now?", "Xml Editor",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (saveChangesDialog == DialogResult.Yes)
{
Save();
return true;
}
else if (saveChangesDialog == DialogResult.Cancel)
{
return false;
}
}
else
{
return false;
}
}
使用该返回值设置 e.Cancel
答案 2 :(得分:0)
将其分成另一个返回布尔值的函数。像这样:
bool ConfirmSave()
{
if (NeedsToSave)
{
DialogResult saveChangesDialog = MessageBox.Show("There are unsaved changes. Save now?", "Xml Editor",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (saveChangesDialog == DialogResult.Yes)
{
Save();
return true;
}
else if (saveChangesDialog == DialogResult.Cancel)
{
return false;
}
}
}
可以从关闭事件发生的任何地方调用此函数,您可以相应地处理结果。
private void FrmEditorFormClosing(object sender, FormClosingEventArgs e)
{
if(!ConfirmSave())
{
e.Cancel = true;
}
}
private void ExitToolStripMenuItemClick(object sender, EventArgs e)
{
ConfirmSave();
Close();
}
答案 3 :(得分:0)
这应该非常接近
private void ExitToolStripMenuItemClick(object sender, EventArgs e)
{
if (DoSaveOnExit())
Save();
else
return;
}
private void FrmEditorFormClosing(object sender, FormClosingEventArgs e)
{
if (DoSaveOnExit())
Save();
else
e.Cancel = true;
}
private bool DoSaveOnExit()
{
if (NeedsToSave)
{
DialogResult saveChangesDialog = MessageBox.Show("T", "Xml Editor",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (saveChangesDialog == DialogResult.Yes)
{
return true;
}
else if (saveChangesDialog == DialogResult.Cancel)
{
return false;
}
}