.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
Нет, вы этого не сделаете.
Я попробовал.
Вы можете вставить следующий код в LINQPad :
var form = new Form();
var b = new Button();
form.Controls.Add(b);
b.Click += delegate { b.Dispose(); };
Application.Run(form);
EDIT : элемент управления будет удален из коллекции формы Controls
. Чтобы продемонстрировать это, замените обработчик кликов следующим:
b.Click += delegate { b.Dispose(); MessageBox.Show(form.Controls.Count.ToString());};
Он покажет 0
.
2 nd РЕДАКТИРОВАТЬ : Control.Dispose (логическое удаление)
содержит следующий код:
if (parent != null) {
parent.Controls.Remove(this);
}
EDIT:
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();
После некоторых тестов я обнаружил, что утилизированные элементы управления автоматически удаляются из родительской коллекции.
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 Конструктор может аварийно завершить работу при удалении элемента управления, производного от swfcontrol, если он не реализует следующее:
Dispose()
{
if(this.parent!=null){
this.parent.controls.remove(this);
}
....
}