Я должен удалить средства управления после расположения их?

.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

Мало объяснения

  • Конечно, если я Расположу управление, то я не буду больше видеть его, но так или иначе, останусь, "Ничто" в родителе не управляет набором?
  • потребность I также, как MSDN рекомендует, удалите все обработчики из управления?
16
задан serhio 6 January 2010 в 15:56
поделиться

5 ответов

Нет, вы этого не сделаете.
Я попробовал.

Вы можете вставить следующий код в 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); 
                }
17
ответ дан 30 November 2019 в 21:45
поделиться

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(); 
4
ответ дан 30 November 2019 в 21:45
поделиться

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

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

UPDATE

из метода Dispose(bool) элемента управления:

if (this.parent != null)
{
    this.parent.Controls.Remove(this);
}
1
ответ дан 30 November 2019 в 21:45
поделиться

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

-1
ответ дан 30 November 2019 в 21:45
поделиться

Дополнительная информация о Compact Framework 2 + VS2005 Конструктор может аварийно завершить работу при удалении элемента управления, производного от swfcontrol, если он не реализует следующее:

Dispose()  
{  
 if(this.parent!=null){  
  this.parent.controls.remove(this);   
 }  
 ....  
}  
1
ответ дан 30 November 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: