如何使用foreach循环删除面板中的所有控件?
题
这是我的代码:
private void ClearSearchResults()
{
foreach (Control X in panel1.Controls)
{
panel1.Controls.Remove(X);
}
}
问题是,当我运行此方法时,只删除了一个项目,然后如果我再次单击一个按钮以便该方法可以再次运行,则会删除另一个项目。
如果我的面板中有10个控件,我必须点击“删除”按钮。我的程序上的按钮多次被删除所有控件。
在这种情况下我该怎么办?
解决方案
这对你有用吗?
private void ClearSearchResults()
{
panel1.Controls.Clear();
}
编辑强调CKret评论。
其他提示
通常,在迭代从中生成的枚举时,您无法从集合中删除。而不是使用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();
我相信你在迭代它的同时从中移除一个项目时会改变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();
}
}
int n;
n = panel1.Controls.Count-1;
for (int i = 0; i <= n; i++ )
{
Control c = panel1.Controls[0];
panel1.Controls.Remove(c);
}
实际上你不能使用 Remove
,因为它打破了迭代器这么简单的解决方案就是这样:
var controls = in c from panel1.Controls select c;
foreach(Controls _control in controls)
{
panel1.Controls.Remove(_control);
}
但当然你不想坚持使用Loop然后继续使用 panel1.Controls.Clear()
while (panel1.Controls.Count != 0)
{
foreach (Control c in panel1.Controls)
{
panel1.Controls.Remove(c);
}
}
另一种方式!
不隶属于 StackOverflow