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

时间:2010-01-06 15:15:49

标签: c# .net .net-2.0 controls dispose

.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

小解释

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

6 个答案:

答案 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。

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

MRP

答案 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)

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