【问题标题】:Remove all controls in a flowlayoutpanel in C#在 C# 中删除 flowlayoutpanel 中的所有控件
【发布时间】:2012-10-01 03:47:06
【问题描述】:

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

我用过:

foreach(Control control in flowLayoutPanel.Controls) 
{
    flowLayoutPanel.Controls.Remove(control);
    control.Dispose(); 
}

但有些控件无法移除。

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

有没有人可以帮忙?

【问题讨论】:

标签: c# flowlayoutpanel


【解决方案1】:

根据MSDN,您可以通过calling the Clear() method 清除ControlCollection(例如FlowLayoutPanel)中的所有控件。例如:

flowLayoutPanel1.Controls.Clear();

请注意:仅仅因为项目已从集合中删除,意味着处理程序已消失,必须妥善处理,以免您面临内存泄漏。

【讨论】:

  • 迄今为止最简单、最快的。起初我没有使用它,因为我需要保留一些面板,同时清除其余部分。但是其他方法太慢了,因此我将需要保留的面板添加到列表中,并在清除后重新添加,谢谢。
  • 是的。此方法是删除 flowlayoutpanel 中所有控件的快速且干净的方法。请将此标记为答案。
【解决方案2】:

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

这对我有用:

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();
}

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

【讨论】:

    【解决方案3】:

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

    List<Control> listControls = flowLayoutPanel.Controls.ToList();
    
    foreach (Control control in listControls)
    {
        flowLayoutPanel.Controls.Remove(control);
        control.Dispose();
    }
    

    也许不是这样,但你明白了。将它们放在一个列表中,然后将它们删除。

    【讨论】:

    • 您需要使用 System.Linq。如果之后仍然没有它,则需要投射对象。在这种情况下,'flowLayoutPanel.Controls.Cast().ToList()'
    【解决方案4】:

    如果您正在寻找一种简单快捷的解决方案。在这里。

    while (flowLayoutPanel.Controls.Count > 0) flowLayoutPanel.Controls.RemoveAt(0);
    

    【讨论】:

    • 正如大多数其他答案中提到的那样,没有 Dispose = 内存泄漏
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多