Need I remove controls after disposing them?

不想你离开。 提交于 2019-12-18 03:11:44

问题


.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

Little explanation

  • Surely, if I Dispose a control I will not see it anymore, but anyway, will remain a "Nothing" in the parent controls collection?
  • need I also, like MSDN recommends, remove all handlers from the control?

回答1:


No, you don't.
I tried it.

You can paste the following code into LINQPad:

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

EDIT: The control will be removed from the form's Controls collection. To demonstrate this, replace the click handler with the following:

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

It will show 0.

2nd EDIT: Control.Dispose(bool disposing) contains the following code:

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



回答2:


EDIT:

MSDN suggests that you remove the object from the Control and then call dispose when removing an object from a collection at runtime:

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(); 



回答3:


But looking at the answer from Mat it looks as though this behavior depends on the framework being used. I think he's suggesting that when using the compact framework some controls must be Removed and also Disposed.

So Microsoft suggesting that we always remove and then dispose kind of makes sense especially if you're moving code modules to other frameworks.

MRP




回答4:


After some tests, I find out that the disposed controls are automatically removed from the parent control collection.

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

UPDATE

from the control's Dispose(bool) method:

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



回答5:


Further Information on Compact Framework 2 + VS2005 Designer may crash when removing a control which is derived from s.w.f.control, if it doesn't implement the following:

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



回答6:


Just keep in mind that if you have some code to iterate over your controls and do something, you would get an exception if one of these controls had been disposed. Therefore, in general I would probably recommend removing the control as good practice.



来源:https://stackoverflow.com/questions/2013877/need-i-remove-controls-after-disposing-them

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!