我需要在处理后删除控件吗?

.NET 2

// dynamic textbox adding myTextBox = new TextBox(); this.Controls.Add(myTextBox); // ... some code, finally // dynamic textbox removing myTextBox.Dispose(); // this.Controls.Remove(myTextBox); ?? is this needed 

小解释

  • 当然,如果我处理一个控件我将不再看到它,但无论如何,在父控件集合中仍将是“Nothing”?
  • 我也需要像MSDN推荐的那样从控件中删除所有处理程序吗?

不,你没有。
我尝试过这个。

您可以将以下代码粘贴到LINQPad中 :

 var form = new Form(); var b = new Button(); form.Controls.Add(b); b.Click += delegate { b.Dispose(); }; Application.Run(form); 

编辑 :控件将从窗体的Controls集合中删除。 为了演示这一点,请使用以下内容替换单击处理程序:

 b.Click += delegate { b.Dispose(); MessageBox.Show(form.Controls.Count.ToString());}; 

它会显示0

2编辑Control.Dispose(bool disposing)包含以下代码:

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

编辑:

MSDN建议您从Control中删除该对象,然后在运行时从集合中删除对象时调用dispose:

http://msdn.microsoft.com/en-us/library/82785s1h%28VS.80%29.aspx

 // dynamic textbox adding myTextBox = new TextBox(); this.Controls.Add(myTextBox); // ... some code, finally // dynamic textbox removing this.Controls.Remove(myTextBox); myTextBox.Dispose(); 

但是看看Mat的答案,看起来好像这种行为取决于所使用的框架。 我认为他建议在使用紧凑框架时,必须删除一些控件并将其置于Disposed状态。

所以微软建议我们总是删除然后处理那些有意​​义的,特别是如果你将代码模块移动到其他框架。

MRP

经过一些测试后,我发现处理过的控件会自动从父控件集合中删除。

 Controls.add(myButton); //Control.Count==4 myButton.Dispose(); //Control.Count==3 

UPDATE

从控件的Dispose(bool)方法:

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

有关Compact Framework 2 + VS2005 Designer的更多信息在删除源自swfcontrol的控件时可能会崩溃,如果它没有实现以下内容:

 Dispose() { if(this.parent!=null){ this.parent.controls.remove(this); } .... } 

请记住,如果您有一些代码来迭代控件并执行某些操作,那么如果已经处理了其中一个控件,则会出现exception。 因此,一般来说,我可能会建议删除控件作为良好的做法。