Можно создать дубликат:
Does Form.Dispose() call controls inside's Dispose()?Как я могу управлять всеми элементами управления в панели или форме в ONCE ??? C#
есть способ сделать это?
Можно создать дубликат:
Does Form.Dispose() call controls inside's Dispose()?Как я могу управлять всеми элементами управления в панели или форме в ONCE ??? C#
есть способ сделать это?
И Группа и класс 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 ...
не заметил = P – Luiscencio
Вы также можете использовать обратный цикл, он не испортит индексы;) –
Я не верю, что есть способ сделать это все сразу. Вы можете просто перебирать дочерние элементы управления и созвонитесь их Dispose методов по одному:
foreach(var control in this.Controls)
{
control.Dispose();
}
Этот метод не работает в Winforms, цикл foreach будет остановлен, потому что коллекция 'this.Controls' была изменена. ** Цикл выйдет раньше, а не все элементы управления будут удалены. ** ['Control.Dispose()' автоматически удаляет элемент управления из его родителя автоматически (если он установлен) (https://referencesource.microsoft.com/#System .Windows.Forms/WinForms/Управляемые/System/WinForms/Control.cs, 5919). – jrh
Вы не даете много деталей, почему.
Это происходит в методе переопределения Dispose формы (в форме.designer.cs). Это выглядит так:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
Вы не делились, если это были ASP.Net или Winforms. Если последнее, вы можете сделать достаточно хорошо, сначала набрав SuspendLayout()
на панели. Затем, когда закончите, позвоните ResumeLayout()
.
WebForms или WinForms? – jrummell