2011-01-23 403 views
3

如何在FlowLayoutPanel中正确地处理用户控件?正确地从FlowLayoutPanel中删除控件

请问flowlayoutpanel1.Controls.RemoveAt(i)够了吗?

我只是找不到一个flowlayoutpanel1.Controls .Dispose()...

+0

Windows窗体我承担所有的控制? – 2011-01-23 16:01:36

回答

1

你想出售的FlowLayoutPanel或全部所有的控制?如果你想处置所有这些,只需处理FlowLayoutPanel。处置控件也会将Controls中的所有内容都放置在Controls集合中。如果您想要处置单个控件,请调用该控件的Dispose方法; FlowLayoutPanel会自动将其从Controls集合中删除。

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

+0

我需要处置一个控件(第一个) – Alex 2011-01-24 00:56:25

+0

没有评论downvote? – 2016-05-27 02:32:38

0

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

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(); 
+0

请解释你的代码,或者至少添加注释行。 – Amith 2013-10-25 10:53:23

1

YourFlowLayoutPanel.Controls.Clear(); 工作时,我需要删除控件集合