Нужно ли удалять элементы управления после их удаления?

.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

Просто имейте в виду, что если у вас есть код для итерации над вашими элементами управления и что-то сделать, вы получите исключение, если бы один из этих элементов управления был удален. Поэтому, в общем, я, вероятно, рекомендовал бы удалить контроль как хорошую практику.