2017-01-30 88 views
2

我与FormClosing事件C#Windows窗体的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关闭表工作:

  1. 取消将返回到窗体不作任何更改
  2. 否将立即关闭表格
  3. YES将打开保存对话框

上面是100%正确的,但是,一旦保存对话框出现,当我点击保存对话框中的取消按钮时,它仍然关闭窗体 - 它也应该返回?

+3

不要直接调用'saveToolStripMenuItem_Click(sender,e);'。编写一个包含逻辑的方法,并从这里和'saveToolStripMenuItem_Click()'处理程序调用它。然后你可以让该方法返回一个布尔值来指示保存对话框是否被取消,并做出适当的响应。 –

+0

“当我点击保存对话框中的取消按钮,它仍然关闭窗体”你确定你的意思是取消?因为当我尝试你的代码并单击取消表单不会关闭,但是当我单击**否**表单关闭时,因为代码中没有处理该情况的逻辑 –

+0

上面的代码在FormClosing事件中? –

回答

2

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

private DialogResult SaveStuff() 
{ 
    return new SaveFileDialog().ShowDialog(); 
} 

这可以在saveToolStripMenuItem_Click事件中使用这样的:

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

取消按钮时,表格应保持不封闭