我需要在处理后删除控件吗?
.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。 因此,一般来说,我可能会建议删除控件作为良好的做法。