.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
答案 0 :(得分:16)
不,你没有。
我试过了。
您可以将以下代码粘贴到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 nd 编辑:Control.Dispose(bool disposing)
包含以下代码:
if (parent != null) {
parent.Controls.Remove(this);
}
答案 1 :(得分:4)
编辑:
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();
答案 2 :(得分:2)
但是看看Mat的答案,看起来好像这种行为取决于所使用的框架。我认为他建议在使用紧凑框架时,必须删除一些控件,并且还必须使用Disposed。
因此微软建议我们总是删除然后处理一些有意义的,特别是如果你将代码模块移动到其他框架。
答案 3 :(得分:1)
经过一些测试后,我发现处理过的控件会自动从父控件集中删除。
Controls.add(myButton); //Control.Count==4
myButton.Dispose(); //Control.Count==3
更新
来自控件的Dispose(bool)方法:
if (this.parent != null)
{
this.parent.Controls.Remove(this);
}
答案 4 :(得分:1)
有关Compact Framework 2 + VS2005的更多信息 如果删除了从s.w.f.control派生的控件,设计器可能会崩溃,如果它没有实现以下内容:
Dispose()
{
if(this.parent!=null){
this.parent.controls.remove(this);
}
....
}
答案 5 :(得分:-1)
请记住,如果您有一些代码来迭代控件并执行某些操作,那么如果已经处理了其中一个控件,则会出现异常。因此,一般来说,我可能会建议将控件删除为良好实践。