Need I remove controls after disposing them?

Viewed 6423

.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?
6 Answers

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

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

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

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.

Related