2017-01-30 85 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

取消按鈕時,表格應保持不封閉