2017-02-13 103 views
4

我正在使用WinForms。我有2種形式,Form1 (主表格)和Form2 (子表格)。當用戶點擊form2頂部的「X」按鈕時,我想關閉form1。在我的代碼中,我試圖通過說this.Owner.Close();來關閉form1,但它會引發錯誤。爲什麼拋出這個錯誤,當用戶單擊窗體頂部的「X」按鈕時,如何關閉子窗體的主窗體。如果用戶點擊「X」按鈕,從子窗體關閉父窗體

錯誤

類型 'System.StackOverflowException' 的未處理的異常發生在System.Windows.Forms.dll中

表1

private void btn_Open_Form2_Click(object sender, EventArgs e) 
    { 
     Form2 frm2 = new Form2(); 
     frm2.Owner = this; 
     frm2.Show(); 
     this.Hide(); 
    } 

窗體2

private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     this.Owner.Close(); 
    } 
+2

'Application.Exit();' – Xaqron

+1

你關閉主人。這將關閉其擁有的窗戶。這將引發FormClosing事件。這將關閉所有者。這將關閉其擁有的窗戶。這將引發FormClosing事件。這將關閉所有者。這將關閉其擁有的窗戶。這將引發FormClosing事件。哪個... Kaboom。使用* bool *變量來中斷遞歸。或FormClosed事件。 –

+0

你爲什麼要這麼做呢?這不是好用戶體驗。 – CodingYoshi

回答

6

當失主的Close方法,提高成交獨資形式的事件處理程序,這樣的代碼使循環導致堆棧溢出。你需要正確的代碼是這樣的:

void Form2_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if(e.CloseReason!= CloseReason.FormOwnerClosing) 
     this.Owner.Close(); 
} 

如果你想關閉關閉所有的表格後的應用程序,你可以使用:

Application.Exit() 
+0

如果你需要告訴整個應用程序退出(這是我需要的),Application.Exit()似乎更好。 – JSWulf

2

你應該從它擁有的形式取出Form2的主人(即Form1中)。然後你就可以關閉Form1沒有無限循環

private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    var form1 = Owner; 
    form1.RemoveOwnedForm(this); 
    form1.Close(); 
} 
相關問題