2012-12-07 131 views
0

我有兩種形式,表2從表繼承1.關閉事件處理程序C#

我需要做的是,當我關閉這兩個表1和表2另一種形式詢問用戶是一定要退出出現。然後,如果用戶點擊是,則當且僅當用戶關閉的表格是表格2而非表格1時,纔會出現詢問用戶是否想要保存遊戲的另一表格,因爲表格1不需要保存。

這是我能夠做到的:

//這些都是表1封閉和封閉的事件處理程序:

private void GameForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    e.Cancel = true; 
    SureClose sc = new SureClose(); 
    sc.StartPosition = FormStartPosition.CenterScreen; 
    sc.Show(); 
} 

private void GameForm_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    MainMenu menu = new MainMenu(); 
    menu.Show(); 
} 

然後在肯定關閉://請注意,比賽是2型從GameForm繼承(表格1)

private void yesButton_Click(object sender, EventArgs e) 
{ 
     this.Hide(); 

     if (GameForm.ActiveForm is Tournament) 
     { 
      SaveGame sg = new SaveGame(); 
      sg.StartPosition = FormStartPosition.CenterScreen; 
      sg.Show(); 
     } 
     else 
     { 
      GameForm.ActiveForm.Close(); 
     } 
    } 

    private void noButton_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
    } 

//這是SAVEGAME形式:

private void saveButton_Click(object sender, EventArgs e) 
{ 
    // Still to do saving! 
} 

private void dontSaveButton_Click(object sender, EventArgs e) 
{ 
    this.Hide(); 
    GameForm.ActiveForm.Close(); 
} 

問題是,當在SureClose窗體中的yesButton事件處理程序中有GameForm.ActiveForm.Close()時,這將返回到GameForm Closing事件處理程序,因此SureClose對話框再次出現。

我試圖做:如果(e.CloseReason()== CloseReason.UserClosing) 但顯然它不工作,要麼是因爲關門的原因永遠是用戶:/

我怎樣才能解決這個? 非常感謝您的幫助!

+0

。然後使用對話結果對結果使用不同的操作。有關示例,請參見[此鏈接](http://stackoverflow.com/questions/3036829/messagebox-with-yes-no-and-dialogresult)。 – AssaultingCuccos

+0

以及爲什麼對話框會改變而不是另一種形式? – Bernice

+0

看看德米特里的答案。它允許你停留在同一個方法中,而不必去另一個類並再次調用上一個方法(這是遞歸的課程),並且如在form1中的虛擬覆蓋所看到的,它不會做任何事情,而在form2中它會詢問保存遊戲。 – AssaultingCuccos

回答

3

Form1中:

private void GameForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if(SureClose()) 
    { 
     SaveChanges(); 
    } 
    else 
    { 
     e.Cancel = true; 
    } 
} 

private bool SureClose() 
{ 
    using(SureClose sc = new SureClose()) 
    { 
     sc.StartPosition = FormStartPosition.CenterScreen; 
     DialogResult result = sc.ShowDialog(); 
     if(result == DialogResult.OK) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

protected virtual void SaveChanges() 
{ 
} 

窗體2:

protected override void SaveChanges() 
{ 
    using(SaveGame sg = new SaveGame()) 
    { 
     sg.StartPosition = FormStartPosition.CenterScreen; 
     DialogResult result = sg.ShowDialog(); 
     if(result == DialogResult.OK) 
     { 
      //saving code here 
     } 
    } 
} 

SureClose形式和遊戲存檔形式:

private void yesButton_Click(object sender, EventArgs e) 
{ 
    this.DialogResult = DialogResult.OK; 
} 

private void noButton_Click(object sender, EventArgs e) 
{ 
    this.DialogResult = DialogResult.Cancel; 
} 
在`GameForm_FormClosing`你可以使用一個消息是/否代替
+0

感謝您的幫助德米特里! DialogResult result = sg.Show(); ---這是返回一個錯誤 - 不能implicitly類型void轉換爲DialogResult 並且這似乎不存在於窗體2中:saveButton_Click(null,null); – Bernice

+0

是的。我的錯。你應該使用ShowDialog(),並且你應該改變你的SaveGame和SureClose表單,這樣當按下右鍵時它們會返回DialogResult.OK –

+0

但事件處理程序不能返回任何東西,他們可以嗎? :/對不起,我是新來的! – Bernice

相關問題