Нужно ли удалять элементы управления после их удаления?
.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
Маленькое объяснение
- Конечно, если я удалю элемент управления, я его больше не увижу, но, в любом случае, останется "ничего" в коллекции родительских элементов управления?
- Нужно ли мне также, как и MSDN, удалить все обработчики из элемента управления?
Ответы
Ответ 1
Нет, нет.
Я попробовал.
Вы можете вставить следующий код в 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 EDIT: Control.Dispose(bool disposing)
содержит следующий код:
if (parent != null) {
parent.Controls.Remove(this);
}
Ответ 2
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();
Ответ 3
Но, глядя на ответ от Mat, похоже, что это зависит от используемой структуры. Я думаю, он предполагает, что при использовании компактной структуры некоторые элементы управления должны быть удалены, а также удалены.
Таким образом, Microsoft предлагает, чтобы мы всегда удаляли и удаляли некоторые из них, особенно если вы перемещаете модули кода в другие структуры.
MRP
Ответ 4
После некоторых тестов я узнаю, что удаленные элементы управления автоматически удаляются из коллекции управляющих элементов.
Controls.add(myButton); //Control.Count==4
myButton.Dispose(); //Control.Count==3
ОБНОВЛЕНИЕ
из метода Dispose (bool):
if (this.parent != null)
{
this.parent.Controls.Remove(this);
}
Ответ 5
Дополнительная информация о Compact Framework 2 + VS2005
Дизайнер может сбой при удалении элемента управления, полученного из s.w.f.control, если он не реализует следующее:
Dispose()
{
if(this.parent!=null){
this.parent.controls.remove(this);
}
....
}
Ответ 6
Просто имейте в виду, что если у вас есть код для итерации над вашими элементами управления и что-то сделать, вы получите исключение, если бы один из этих элементов управления был удален. Поэтому, в общем, я, вероятно, рекомендовал бы удалить контроль как хорошую практику.