C#Windows窗体关闭事件

C#Windows窗体关闭事件,c#,winforms,formclosing,C#,Winforms,Formclosing,我正在处理FormClosing事件 DialogResult dg = MessageBox.Show("Do you want to save changes?", "Closing", MessageBoxButtons.YesNoCancel); if (dg == DialogResult.Yes) { saveToolStripMenuItem_Click(sender, e); } else if (dg == DialogResult.Cancel) { e.C

我正在处理
FormClosing
事件

DialogResult dg = MessageBox.Show("Do you want to save changes?", "Closing", MessageBoxButtons.YesNoCancel);

if (dg == DialogResult.Yes)
{
    saveToolStripMenuItem_Click(sender, e);
}
else if (dg == DialogResult.Cancel)
{
    e.Cancel = true;
}
当我单击X关闭表单时,此代码工作正常:

  • “取消”将返回表单,不做任何更改
  • 否将立即关闭窗体
  • 是将打开“保存”对话框

  • 以上是100%正确的,但是,一旦出现“保存”对话框,当我单击“保存”对话框中的“取消”按钮时,它仍然会关闭表单-它也会返回?

    正如Matthew Watson所建议的,您可以创建一个帮助方法。以下是它的简短版本:

    private DialogResult SaveStuff() 
    {
        return new SaveFileDialog().ShowDialog();
    }
    
    这可以在
    saveToolStripMenuItem\u单击事件中使用,如下所示:

    private void saveToolStripMenuItem_Click(object sender, EventArgs e)
    {
        DialogResult dr = SaveStuff();
    
        if (dr == DialogResult.OK)
        {
            // ...
        }
    }
    
    但最重要的是,您可以在
    FormClosing
    事件中使用它,并检查返回值:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        DialogResult dg = MessageBox.Show("Do you want to save changes?", "Closing", MessageBoxButtons.YesNoCancel);
    
        if (dg == DialogResult.Yes)
        {
            if (SaveStuff() == DialogResult.Cancel)
            {
                e.Cancel = true;
            }
        }
        else if (dg == DialogResult.Cancel)
        {
            e.Cancel = true;
        }
    }
    

    这样,当点击
    SaveFileDialog

    不调用
    saveToolStripMenuItem\u单击(发件人,e)时,表单应保持未关闭状态直接。编写一个包含逻辑的方法,并从这里和
    saveToolStripMenuItem\u Click()
    处理程序调用它。然后,您可以使该方法返回bool,以指示保存对话框是否已取消,并做出相应的响应。“当我单击保存对话框内的取消按钮时,它仍会关闭表单”您确定是指取消吗?因为当我尝试您的代码并单击“取消”时,表单不会关闭,但当我单击“否”时,表单会关闭,因为您的代码中没有处理该情况的逻辑。这是FormClosing事件中的代码吗?您好,Mong Zhu,提示“是,否,取消”中的“取消”正常工作。我指的“取消”是“保存”对话框的“取消”。我看不到“保存”对话框的任何代码。如果你有问题,为什么不发布相关代码?