这是我的代码:

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);
    }
}

另一种方式!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top