这是我的代码:
private void ClearSearchResults()
{
foreach (Control X in panel1.Controls)
{
panel1.Controls.Remove(X);
}
}
问题是,当我运行此方法时,只删除了一个项目,然后如果我再次单击一个按钮以便该方法可以再次运行,则会删除另一个项目。
如果我的面板中有10个控件,我必须多次单击程序中的“删除”按钮才能删除所有控件。
在这种情况下我该怎么办?
答案 0 :(得分:16)
通常,在迭代从中生成的枚举时,您无法从集合中删除。而不是使用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();
答案 1 :(得分:14)
这对你有用吗?
private void ClearSearchResults()
{
panel1.Controls.Clear();
}
编辑强调CKret评论。
答案 2 :(得分:8)
我相信你在迭代它时从中删除一个项目时会改变IEnumerable。
尝试使用简单的for循环而不是foreach。
答案 3 :(得分:3)
首先,您不应在foreach循环中编辑IEnumerable集合。你应该使用for循环或一段时间。
即。
private void ClearSearchResults()
{
while (panel1.Controls.Count > 0)
{
panel1.Controls.RemoveAt(0);
}
}
或只是使用:
panel1.Controls.Clear();
答案 4 :(得分:2)
也许这个:
panel1.Controls.Clear()
答案 5 :(得分:1)
由于我不知道您使用的面板类型,通常可以致电panel1.Controls.Clear
答案 6 :(得分:0)
private void ClearSearchResults()
{
foreach (Control X in panel1.Controls)
{
panel1.Controls.Remove(X);
}
if (panel1.Controls.Count > 0)
{
ClearSearchResults();
}
}
答案 7 :(得分:0)
实际上你不能使用Remove
,因为它打破了迭代器这么简单的解决方案就是这样:
var controls = in c from panel1.Controls select c;
foreach(Controls _control in controls)
{
panel1.Controls.Remove(_control);
}
但当然你不想坚持使用Loop然后继续使用panel1.Controls.Clear()
答案 8 :(得分:0)
int n;
n = panel1.Controls.Count-1;
for (int i = 0; i <= n; i++ )
{
Control c = panel1.Controls[0];
panel1.Controls.Remove(c);
}
答案 9 :(得分:0)
while (panel1.Controls.Count != 0)
{
foreach (Control c in panel1.Controls)
{
panel1.Controls.Remove(c);
}
}
另一种方式!