2009-11-18 68 views
4

我正在使用名爲tabDocuments的TabControl的窗體。我遇到了這段代碼,它刪除了TabControl中的所有頁面。刪除TabPage:處置或清除或兩者?

for (int i = tabDocuments.TabPages.Count - 1; i > -1; i--) { 
    tabDocuments.TabPages[i].Dispose(); 
} 
    tabDocuments.TabPages.Clear(); 

寫這段代碼的人已經離開了一段時間。我試圖理解爲什麼代碼在處理每個tabPages後調用Clear()(對我來說看起來不是必需的)。任何人都可以向我解釋爲什麼?或者調用Clear()額外?

回答

3

這個片段是從Control.Dispose:

 if (this.parent != null) 
     { 
      this.parent.Controls.Remove(this); 
     } 

因此,你只需要調用Dispose,尚不清楚。

+0

謝謝,你在哪找到Control.Dispose的片段? – David 2009-11-18 16:47:05

+0

反射器 - http://www.red-gate.com/products/reflector/ – 2009-11-18 16:49:02

+1

@Xaero,雖然,你是正確的控制從它的父母本身。你只是通過拆解組件才知道這一點。沒有在該方法的公共文檔中的哪個位置說明它將自己從其父項中移除。該功能可以在該框架的未來版本中更改。我知道調用程序集可以針對特定版本的.NET框架。但是,根據公共文檔(即使不需要)調用該方法並不是更好的做法。 – rocka 2009-11-18 18:11:28

2

在每個選項卡頁上調用Dispose()實際上並沒有將它們從TabPages集合中移除,它只是簡單地放置它們。對Clear()的調用就是將它們從集合中刪除。如果你沒有調用Clear(),他們仍然會在那裏,壞的事情可能會發生,因爲你最終會試圖在它們被處置後使用它們。

+2

從我的實驗中,處理tabpage會將其從TabControl中刪除 – David 2009-11-18 16:28:06

+0

這真令人吃驚!我沒有意識到這一點。 – 2009-11-18 16:29:12

+0

即使是這樣,你也不應該將它當作代碼模式使用,它可能會導致其他Disposable對象出現錯誤。 – 2009-11-18 16:33:06

1

首先從集合中刪除一個選項卡,然後刪除()。永不Dispose()一些仍在使用的東西,因爲它會導致異常和奇怪的行爲。

此外,請確保沒有其他人具有對製表符的引用,否則這些引用將在Dispose()上變爲無效。

+0

所有控件都不是這種情況嗎?這就是爲什麼IsDisposed屬性存在... – 2009-11-18 16:41:11

+0

通常你不會處理控件,它們存在於整個應用程序中,它們不保留關鍵的非託管資源。您可能想要處理用作一次性對話框的表單。然後,表單將處理其控制。 – 2009-11-18 17:06:59