在关闭程序时提示用户保存之间减少代码重复的优雅方法?

时间:2012-10-04 19:40:04

标签: c# refactoring code-duplication

当退出程序时,如果程序员处理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();
}

4 个答案:

答案 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;
    }

}