6

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

我用了:

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

但是某些控件无法删除。

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

任何身体都可以帮忙吗?

4

4 回答 4

13

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

flowLayoutPanel1.Controls.Clear();

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

于 2016-02-12T20:58:43.710 回答
12

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

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

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

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

于 2012-10-01T15:25:15.173 回答
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();
}

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

于 2015-10-19T09:49:53.220 回答
0

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

while (flowLayoutPanel.Controls.Count > 0) flowLayoutPanel.Controls.RemoveAt(0);
于 2016-09-19T09:22:32.270 回答