2009-10-02 1 views

ответ

25

И Группа и класс Form имеют свойство коллекции Controls, которая имеет метод Clear() ...

MyPanel.Controls.Clear(); 

или

MyForm.Controls.Clear(); 

Но Clear() не называют dispose() (Все, что он делает, это удалить его из коллекции), так что вам нужно сделать, это

List<Control> ctrls = new List<Control>(MyPanel.Controls); 
    MyPanel.Controls.Clear(); 
    foreach(Control c in ctrls) 
     c.Dispose(); 

Вам нужно создать отдельный список ссылок, так как Dispose также удалит элемент управления из коллекции, изменив индекс и испортив foreach ...

+0

не заметил = P – Luiscencio

+6

Вы также можете использовать обратный цикл, он не испортит индексы;) –

1

Я не верю, что есть способ сделать это все сразу. Вы можете просто перебирать дочерние элементы управления и созвонитесь их Dispose методов по одному:

foreach(var control in this.Controls) 
{ 
    control.Dispose(); 
} 
+1

Этот метод не работает в Winforms, цикл foreach будет остановлен, потому что коллекция 'this.Controls' была изменена. ** Цикл выйдет раньше, а не все элементы управления будут удалены. ** ['Control.Dispose()' автоматически удаляет элемент управления из его родителя автоматически (если он установлен) (https://referencesource.microsoft.com/#System .Windows.Forms/WinForms/Управляемые/System/WinForms/Control.cs, 5919). – jrh

1

Вы не даете много деталей, почему.

Это происходит в методе переопределения Dispose формы (в форме.designer.cs). Это выглядит так:

protected override void Dispose(bool disposing) 
{ 
    if (disposing && (components != null)) 
    { 
     components.Dispose(); 
    } 

    base.Dispose(disposing); 
} 
0

Вы не делились, если это были ASP.Net или Winforms. Если последнее, вы можете сделать достаточно хорошо, сначала набрав SuspendLayout() на панели. Затем, когда закончите, позвоните ResumeLayout().

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