C# 在关闭程序时提示用户保存之间减少代码重复的优雅方法?
退出程序时,如果程序员处理C# 在关闭程序时提示用户保存之间减少代码重复的优雅方法?,c#,refactoring,code-duplication,C#,Refactoring,Code Duplication,退出程序时,如果程序员处理FormClosing事件,如果存在未保存的数据,则程序员可以提示保存对话框,询问他们是否要保存、不保存或取消操作 在FormClosing事件中,如果他们点击了Cancel,则取消您设置的操作e.Cancel=true。这很好。但是,在菜单中,如果用户点击退出按钮,则应发生相同的事情,除了不执行e.Cancel=true它应该只做返回因为它是句柄菜单项单击事件,而不是表单关闭事件 现在,我几乎已经复制了代码,我想知道是否有一种方法可以处理这个问题,以优雅和易懂的方式避
FormClosing
事件,如果存在未保存的数据,则程序员可以提示保存对话框,询问他们是否要保存、不保存或取消操作
在FormClosing事件中,如果他们点击了Cancel
,则取消您设置的操作e.Cancel=true代码>。这很好。但是,在菜单中,如果用户点击退出按钮,则应发生相同的事情,除了不执行e.Cancel=true
它应该只做返回代码>因为它是句柄菜单项单击
事件,而不是表单关闭
事件
现在,我几乎已经复制了代码,我想知道是否有一种方法可以处理这个问题,以优雅和易懂的方式避免重复
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();
}
将公共代码放在返回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将公共代码放在一个返回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将其分离为返回布尔值的不同函数。大概是这样的:
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();
}
将其分离为返回布尔值的不同函数。大概是这样的:
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();
}
你不应该这样做。在菜单单击处理程序中调用Close会触发FormClosing事件,您可以在那里取消它。您不需要这样做。在菜单单击处理程序中调用Close应该会触发FormClosing事件,您可以在那里取消它。这应该非常接近
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;
}
}
这应该很接近
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;
}
}
你不应该这样做。在菜单单击处理程序中调用Close会触发FormClosing事件,您可以在那里取消它。@MattBurland:噢,哇,我都没意识到。如果你回答这个问题,我会接受的。你不需要这样做。在菜单单击处理程序中调用Close会触发FormClosing事件,您可以在那里取消它。@MattBurland:噢,哇,我都没意识到。如果你这样回答,我会接受的。或者马特·伯兰写的。:)或者马特·伯兰所写的。:)