2010-08-22 30 views
0

我在我的代碼中放置了一個對象,現在我想再次創建它。如何在處理對象後創建對象?

我該怎麼做?

答案是:

private void showToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     xpPanelGroup1.CreateControl(); 
     xpPanelGroup1.Visible = true; 
     ... 


    } 
    private void noShowToolStripMenuItem_Click(object sender, EventArgs e) 
      { 
       xpPanelGroup1.Visible = false; 
        ... 
       xpPanelGroup1.Dispose(); 
      } 
+0

請問您可以添加您的代碼嗎? – 2010-08-22 09:15:27

+0

否否否否否否否 - 調用CreateControl()可能會重新創建基礎窗口句柄,但實際的控件本身仍然處置完畢。你會發現,當你最終關閉表單時,新的控制手柄永遠不會被清理。您正朝着正確的方向前進,在您的項目中稍後體驗到一系列調試困難 - 併爲您的應用程序引入用戶機器的不穩定性。 – Bevan 2010-08-23 07:40:12

+0

嘿人,我必須處理我的control.so,所有答案使用.Visible = true不適合我! 好嗎? 所以,不要在我的問題X上推負面投票< – 2010-08-23 08:59:22

回答

5

您需要在調用Dispose()後創建一個新對象。

但是,如果您想稍後重新使用該對象,則不應該使用該對象,如果您暫時想要隱藏控件,則可以嘗試使用Hide.Visible = false或類似內容。

編輯:在你的代碼創建一個新的xpPanelGroup1:

UIComponents.XPPanelGroup xpPanelGroup1 = new UIComponents.XPPanelGroup() ; 

但這只是局部的showToolStripMenuItem_Click方法。如果你只是鍵入

xpPanelGroup1 = new UIComponents.XPPanelGroup() ; 

你正在使用類成員,這是你在noShow方法中處理的同一個變量。
但我仍然建議只是隱藏而不是處置。

+0

使用Hide()或Visible = false或類似的+1。爲什麼?在任何WinForms控件上調用Dispose()之前,您需要確保將它從表單中正確地移除 - 從相關的控件列表中取出,取消任何事件等等。可以完成 - 但要正確地執行它非常複雜,並且很容易導致令人討厭的內存泄漏,或者更糟。 – Bevan 2010-08-22 09:38:50

+0

請說另一種方式... 我處置它:| – 2010-08-22 09:40:41

+0

我編輯了我的答案,並在代碼中出現錯誤。 – 2010-08-22 09:46:54

0

你應該在你的設計代碼(在設計時自動生成「了.Designer.cs」文件)一看,並嘗試調用它。這是在實例化小部件時運行的代碼。

+1

但是,由WinForms設計器生成的代碼僅設計爲每個實例運行*一次*。多次爲單個實例運行會泄漏大量的USER句柄。用完這些(每個進程的限制只有10k),你的進程將被徹底殺死,就像肥皂泡破滅一樣。沒有沃森博士,沒有伐木,沒有 - 只是*走了*。不好。 – Bevan 2010-08-22 09:35:21

0

也許你可以將對象設置爲null而不是配置它,並且當你想再次使用它時將它重新分配給另一個值。

+1

問題在於WinForms控件往往會在後臺抓取彼此的引用。 – Bevan 2010-08-22 09:36:42