1

退出程序时,如果程序员处理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

4 回答 4

3

你不应该这样做。在您的菜单单击处理程序中调用 Close 应该会触发 FormClosing 事件,您可以在那里取消它。

于 2012-10-04T19:52:38.580 回答
1

将通用代码放在返回布尔值的方法中,以指示是否发生了保存

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

于 2012-10-04T19:43:04.313 回答
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();
}
于 2012-10-04T19:43:24.977 回答
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;
    }

}
于 2012-10-04T19:53:07.283 回答