2009-11-18 3 views
4

Я работаю над формой окна, которая имеет TabControl с именем tabDocuments. Я наткнулся на этот фрагмент кода, который удаляет все страницы из TabControl.Удалить TabPage: Dispose или Clear или оба?

for (int i = tabDocuments.TabPages.Count - 1; i > -1; i--) { 
    tabDocuments.TabPages[i].Dispose(); 
} 
    tabDocuments.TabPages.Clear(); 

Лицо, написавшее этот код, уже покинуло некоторое время назад. Я пытаюсь понять, почему код вызывает Clear() после удаления каждой из tabPages (для меня это выглядит неуместно). Может ли кто-нибудь объяснить мне почему? Или вызывается Clear() дополнительно?

ответ

3

Этот фрагмент кода от Control.Dispose:

 if (this.parent != null) 
     { 
      this.parent.Controls.Remove(this); 
     } 

Поэтому вы просто должны вызвать Dispose, не ясно.

+0

Спасибо, где вы нашли фрагмент Control.Dispose? – David

+0

Reflector - http://www.red-gate.com/products/reflector/ –

+1

@Xaero. Хотя вы правы в том, что элемент управления удаляется из своего родителя. Вы только знаете, что, разобрав сборку. Нет, где в публичной документации для метода говорится, что он удаляет из него родительский. Эта функциональность может быть изменена в будущей версии фреймворка. Я знаю, что вызывающая сборка может ориентироваться на определенную версию .NET Framework. Однако не лучше ли было бы использовать метод, поскольку они предназначены на основе публичной документации (даже если это не обязательно). – rocka

2

Вызов Dispose() на каждой странице вкладок фактически не удаляет их из коллекции TabPages, она просто их использует. Вызов Clear() - это то, что удаляет их из коллекции. Если вы не вызываете Clear(), они все равно будут там, и плохие вещи, скорее всего, произойдут, потому что вы в конечном итоге попытаетесь использовать их после того, как они были удалены.

+2

Из моего эксперимента, удаляя закладку, удаляется из TabControl – David

+0

. Это удивительно! Я не знал об этом. –

+0

Даже если это так, вы не должны использовать его в качестве шаблона кода, это может привести к ошибкам с другими одноразовыми объектами. –

1

Сначала удалите вкладку из коллекции, затем Dispose(). Никогда не удаляйте() то, что все еще используется, так как это приведет к исключениям и странному поведению.

Кроме того, убедитесь, что у других нет ссылок на вкладки, иначе эти ссылки станут недействительными в Dispose().

+0

Не так ли для всех элементов управления? Вот почему свойство IsDisposed существует ... –

+0

Обычно вы не устанавливаете элементы управления, они существуют во всем приложении, и они не сохраняют критические неуправляемые ресурсы. Вы можете захотеть избавиться от форм, используемых в качестве разовых диалогов. Затем форма будет располагать свои элементы управления. –

Смежные вопросы