2012-06-26 22 views
0

我有兩種形式,並form1需要從form2獲取數據的析構函數,我用一個參數form2構造函數來獲取form1's情況是這樣的:如何讓C#不叫實例

public form2(Form form1) { 
this.f = form1; 
} 

和在窗體1:

Form form2 = new Form(this); 

但它似乎form1 destruct被稱爲當我關閉form1。我的問題是我如何避免這個問題?

編輯:我有很多的打字錯誤在我的問題,我很抱歉,固定:

我有兩種形式,並form2需要從form1獲取數據,我用一個參數form1構造函數得到form1's情況是這樣的:

private Form f; 
public form2(Form form1) { 
this.f = form1; 
} 

,並在Form1:

Form form2 = new Form(this); 

但是,當我關閉form2時,似乎form1析構函數被調用。我的問題是我如何避免這個問題?

+1

您的主題非常具有誤導性。 – leppie

+2

C#沒有確定性的析構函數,所以我想你的意思是它調用Dispose(),你得到一個ObjectDisposedException,你能證實這一點嗎? – CodingGorilla

+2

你不能使用隱藏功能來保持它活着但不可見嗎? – SimpleVar

回答

5

MSDN

當窗體關閉時,對象中創建的所有資源是 閉合和形式被佈置。通過處理Closing事件並將CancelEventArgs的Cancel 屬性作爲參數傳遞給事件 處理程序,可以防止在運行時關閉表單 。

因此,爲了防止支配的資源,你唯一可以做的事情是隱藏的,而不是關閉它的形式:

bool reallyClose; 

protected override void OnClosing(CancelEventArgs e) 
{ 
    if (!reallyClose) 
    { 
     e.Cancel = true; 
     Hide(); 
    } 
    base.OnClosing(e); 
} 

這將防止被關閉的形式,除非你手動設置reallyClose標誌爲true在關閉表格之前。

您應該確保在完成使用後正確關閉表格。

另一種選擇可能是將您需要從Form1中檢索的數據從表單本身中分離出來。

0

在這種情況下,表單1不能被銷燬,直到form2也關閉。只要form2具有對form1的引用,form1將繼續存在。更可能的是,你擔心form1被處置。當form1關閉時,它將自行處理。該對象仍然存在,但它將釋放其所有子控件和系統對象,如窗口句柄和繪圖對象。一旦表格被處理完畢,它就不能再顯示出來了,它的所有控件都將無法訪問。如果您嘗試使用已處理表單的任何可視化組件,它將拋出ObjectDisposedException。如果你想停止表單處理,只需隱藏它而不是關閉它。但是,您應該在Form2不再需要它時再關閉它,否則它會留在內存和資源上。

0

您應該真正地將所有需要的數據都用於這兩種形式,從而避免首先將形式構造函數耦合在一起的問題。