2011-05-25 64 views
2

我想關閉我的主窗體(父窗體)時關閉子表單。但是,這給了我一個StackOverflow異常。關閉我的表單時出現StackOverflow

但是,如果我在FormClosed事件上調用_child.Dispose,它將按預期工作。我應該這樣做嗎?我爲什麼要調用Dispose? (因爲.Show(的),它不應該是neceserry權

小演示:

public partial class frmChild : Form 
{ 
    public frmChild() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 
} 

public partial class frmParent : Form 
{ 
    private frmChild _child; 

    public frmParent() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     _child = new frmChild(); 
     _child.FormClosed += child_FormClosed; 
     _child.Show(this); 
    } 

    void child_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     //_child.Dispose(); <-- uncomment and it works 
     this.Close(); // <-- StackOverflow exception 
    } 
} 

的解決方案,通過泰奧曼Soygul(評論以供將來參考):

關閉主窗體具有 this.Close();信號的所有子 窗口關閉,以便使得 創建無限循環

在父母中調用this.Close()之後,它會發信號通知所有孩子關閉aswel,這將發送另一個FormClosed事件... 我解決了它沒有指定所有者在_child.Show();我沒有使用所有者無論如何。

回答

6

由於每當您撥打this.Close();FormClosed事件被觸發,然後再次調用this.Close();,則會創建一個無限循環。另一方面,如果表單已經處理完畢(如同取消註釋處理行一樣),則由於對象已被處置,因此FormClosed事件不會再次被觸發。因此,在處置該事件的形式是正確的,或者如果你不想這樣做,你可以像一個私人布爾字段添加額外的檢查:

if (!formClosed) 
{ 
    this.formClosed = true; 
    this.Close(); 
} 
+0

不,這將再次給我一個StackOverflowException 。 – RvdK 2011-05-25 13:04:54

+0

@Roy,用另外的支票更新了建議。 – 2011-05-25 13:08:02

+0

小孩的FormClosed被解僱,但如果我在frmParent中致電close,父母的FormClosed會被解僱(不是孩子)。那麼這怎麼可能是一個無限循環? – RvdK 2011-05-25 13:11:22