我有一个Panel控件。在面板内部,用户可以添加组合框,文本框的标签等并拖动它们,并且我的表单上有一个删除按钮,如果他们点击它,它将删除该面板内的所有控件。但是这段代码:
foreach( Control control in panel.Controls )
{
control.Dispose();
}
......不能正常工作。它并不总是处理面板内的所有控件。有时它会消除掉它们中的大多数,有时它只能摆脱一两个。有时除了1以外都是处理。 WTF?
修改
<小时/> 以下是我用于将控件添加到Panel的代码:
button1_Click(object sender, EventArgs e)
{
TextBox tbox = new TextBox();
tbox.Multiline = true;
tbox.IsAccessible = true;
panel.Controls.Add(tbox);
}
答案 0 :(得分:8)
Dispose()
只清理非托管资源(尽管Paul Williams在评论中指出它通常比这更复杂!)所以它可能会或可能不会对你的情况做任何有用的事情。
尝试使用RemoveAt(i)
方法删除控件,而不是Dispose()
:
for(int i = panel.Controls.Count-1; i >= 0; i--)
{
panel.Controls.RemoveAt(i);
}
答案 1 :(得分:7)
删除所有控件的简单方法是执行此操作:
panel.Controls.Clear();
编辑:感谢Pieter和Paolo,只是调用Clear()这样会泄漏内存,因为没有处理控件,所以这不是一个好习惯。
答案 2 :(得分:3)
之前我已经看到过这种情况,您正在从集合中删除使集合本身变小的项目。 例如,当你向下移动时,如果集合中有5个项目,你会比你期望的更早到达列表的末尾,因为你发出的每个Dispose()都会使列表变小。
答案 3 :(得分:0)
我知道这是一个很老的帖子,但我希望可以帮助别人。
我找到的唯一方法是:
while(panel.Controls.Count > 0)
{
panel.Controls[0].Dispose();
}
这样,如果控件列表在循环中间变小,则无关紧要。