正确地从FlowLayoutPanel中删除控件

时间:2011-01-23 15:57:57

标签: c# winforms

如何在FlowLayoutPanel中正确处置用户控件?

flowlayoutpanel1.Controls.RemoveAt(i)是否足够?

我找不到flowlayoutpanel1.Controls ...

的.Dispose()

4 个答案:

答案 0 :(得分:2)

如果要删除所有控件,可以向后遍历控件集合,而不是创建副本(参见下文)。

我发现这提供了最佳解决方案,特别是如果您打算在之后重新填充它。强制GC收集有助于在有大量控件的地方检查内存使用情况。

FlowLayoutPanel.SuspendLayout();

if (FlowLayoutPanel.Controls.Count > 0) {
    for (int i = (FlowLayoutPanel.Controls.Count - 1); i >= 0; i--) {
        Control c = FlowLayoutPanel.Controls[i];
        c.SomeEvent -= SomeEvent_Handler;
        c.Dispose();
    }
    GC.Collect();
}

FlowLayoutPanel.ResumeLayout();

答案 1 :(得分:1)

您想要处理FlowLayoutPanel中的所有控件还是所有控件?如果要丢弃所有这些,只需处置FlowLayoutPanel即可。处置控件也会将所有内容都放在Controls集合中。如果要处理单个控件,请调用该控件的Dispose方法; FlowLayoutPanel会自动将其从Controls集合中删除。

如果要处理所有控件,而不是FlowLayoutPanel本身,则有点棘手。您不能仅仅通过控件集合进行操作并处理每个控件,因为这会导致控件集合被修改。相反,您可以将Controls集合复制到单独的列表中并从那里处理它们。

答案 2 :(得分:1)

YourFlowLayoutPanel.Controls.Clear(); 我需要删除控件集合中的所有控件时工作

答案 3 :(得分:0)

如果控件具有Dispose()方法,只需在从面板中删除它后调用它。