2012-10-01 62 views
4

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

我用:

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

但某些控件无法删除。

我试图找到一个在互联网上的解决方案,但发现无处。

任何机构都可以帮忙吗?

+0

是否存在错误,如输出窗口中抛出的异常或消息?如果是这样,请将其添加到问题中? – akton

+0

“输出”窗口中没有例外或消息,Akton。只有一件事,一些控件仍然显示在面板中。 – Johnny

+0

[正确处理和删除对UserControls的引用,以避免内存泄漏]的可能的重复(http://stackoverflow.com/questions/12610535/properly-disposing-of-and-removing-references-to-usercontrols-to -avoid-memory) –

回答

8

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

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

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

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

+1

@oberfreak感谢您的编辑。好东西在那里! – Yoinazek

+1

我没有ToList()方法。 – matheusvmbruno

+4

您需要使用System.Linq。如果之后你还没有,你需要投射物体。在这种情况下'flowLayoutPanel.Controls.Cast ().ToList()' – Yoinazek

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

有可能做的更好/更清洁的方式它,但它的作品。

5

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

flowLayoutPanel1.Controls.Clear(); 

注意:不意味着处理程序都走了,必须妥善处理少,你面对的内存泄漏只是因为项目是从集合中删除。

0

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

while (flowLayoutPanel.Controls.Count > 0) flowLayoutPanel.Controls.RemoveAt(0); 
相关问题