[英]How can I use a foreach loop to delete all of the control in a panel?
这是我的代码:
private void ClearSearchResults()
{
foreach (Control X in panel1.Controls)
{
panel1.Controls.Remove(X);
}
}
问题是,当我运行此方法时,只删除一个项目,然后如果我再次单击一个按钮以便该方法可以再次运行,则删除另一个项目。
如果我的面板中有10个控件,我必须多次单击程序上的“删除”按钮才能删除所有控件。
在这种情况下我该怎么办?
通常,在迭代从中生成的枚举时,您无法从集合中删除。 而不是使用foreach,典型的方法是使用for循环向后工作:
private void ClearSearchResults()
{
for(int i=panel1.Controls.Count-1;i>=0;--i) {
panel1.Controls.RemoveAt(i);
// or
// Control X = panel1.Controls[i];
// panel1.Controls.Remove(X);
}
}
但是,在这种情况下,只需使用clear:
panel1.Controls.Clear();
这对你有用吗?
private void ClearSearchResults()
{
panel1.Controls.Clear();
}
编辑强调CKret评论。
我相信你在迭代它的同时从中移除一个项目时正在更改IEnumareble。
尝试使用简单的for循环而不是foreach。
首先,您不应该在foreach循环中编辑IEnumerable集合。 你应该使用for循环或一段时间。
即
private void ClearSearchResults()
{
while (panel1.Controls.Count > 0)
{
panel1.Controls.RemoveAt(0);
}
}
或者只是使用:
panel1.Controls.Clear();
也许这个:
panel1.Controls.Clear()
由于我不知道您使用的面板类型,通常可以调用panel1.Controls.Clear
private void ClearSearchResults()
{
foreach (Control X in panel1.Controls)
{
panel1.Controls.Remove(X);
}
if (panel1.Controls.Count > 0)
{
ClearSearchResults();
}
}
实际上你不能使用Remove
因为它打破了迭代器这么简单的解决方案就是这样的:
var controls = in c from panel1.Controls select c;
foreach(Controls _control in controls)
{
panel1.Controls.Remove(_control);
}
但是你当然不想坚持Loop然后继续使用panel1.Controls.Clear()
int n;
n = panel1.Controls.Count-1;
for (int i = 0; i <= n; i++ )
{
Control c = panel1.Controls[0];
panel1.Controls.Remove(c);
}
while (panel1.Controls.Count != 0)
{
foreach (Control c in panel1.Controls)
{
panel1.Controls.Remove(c);
}
}
其他方式 !
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.