删除C#中flowlayoutpanel中的所有控件

Joh*_*nny 4 c# flowlayoutpanel

我正在构建一个流程布局面板,其中每个控件代表一个房间.我想通过删除面板中的所有控件并添加新控件来重新加载所有空间.

我用了:

foreach(Control control in flowLayoutPanel.Controls) 
{
    flowLayoutPanel.Controls.Remove(control);
    control.Dispose(); 
}
Run Code Online (Sandbox Code Playgroud)

但有些控件无法删除.

我试图在互联网上找到解决方案,但无处可寻.

身体有帮助吗?

Yoi*_*zek 11

那是因为您要从正在迭代的同一列表中删除控件.尝试这样的事情

List<Control> listControls = flowLayoutPanel.Controls.ToList();

foreach (Control control in listControls)
{
    flowLayoutPanel.Controls.Remove(control);
    control.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

也许不是那样,但你明白了.将它们放入列表中,然后将其删除.

  • 您需要在使用中使用System.Linq.如果之后仍然没有,则需要转换对象.在这种情况下'flowLayoutPanel.Controls.Cast <Control>().ToList()' (4认同)

Sho*_*Sha 9

根据MSDN,您可以通过调用方法清除ControlCollection(例如a FlowLayoutPanel)中的所有控件.例如:Clear()

flowLayoutPanel1.Controls.Clear();
Run Code Online (Sandbox Code Playgroud)

请注意:仅仅因为从集合中删除项目并不意味着处理程序已经消失,必须妥善处理,减少您面临的内存泄漏.


Fak*_*r17 6

注意:这是基于先前评论的有效解决方案,因此归功于该人:)

这对我有用:

List<Control> listControls = new List<Control>();

foreach (Control control in flowLayoutPanel1.Controls)
{
     listControls.Add(control);
}

foreach (Control control in listControls)
{
     flowLayoutPanel1.Controls.Remove(control);
     control.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

可能有更好/更清洁的方法,但它有效。