2009-11-18 24 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