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:噢,哇,我都没意识到。如果你这样回答,我会接受的。或者马特·伯兰写的。:)或者马特·伯兰所写的。:)