1

我有一个表单(C#)和几个面板。在一个面板上,我放置了一个按钮,一旦单击它就会删除表单上的所有面板。这是我的代码:

        mainForm = (MainForm)this.FindForm();
        foreach (Control c in mainForm.Controls)
        {
            if (c is Panel)
            {
                mainForm.Controls.Remove(c);
                this.Refresh();
            }
        }

问题是:在 mainForm.Controls 上找不到任何面板我该如何解决?谢谢你。

4

2 回答 2

0

如果要继续使用foreach,则必须Controls反向循环,如果使用for,则必须从最后一个控件循环到第一个控件(相反顺序):

foreach(Control c in mainForm.Controls.OfType<Control>().Reverse())
{
    if (c is Panel)
    {
      mainForm.Controls.Remove(c);      
    }
}

我认为在这种情况下,您应该使用 afor来循环Controls从最后一个索引到第一个索引。这是任何其他的最佳解决方案。foreach并不总是取代for并且LINQ并不总是最好的。这种方法不需要任何其他执行来从您的集合中选择项目,命令您的集合和内存来保存一些额外的变量或引用:

for(int i = mainForm.Controls.Count - 1; i >= 0; i--){
  if(mainForm.Controls[i] is Panel){
     mainForm.Controls.RemoveAt(i);
  }
}
于 2013-07-24T03:23:36.663 回答
0

您的代码至少有一个问题是您在 foreach 循环中时不允许更新您的列表。但是您mainForm.Controls在迭代它的同一循环中进行修改。有时 WinForms 会默默地吞下这些异常,而您甚至没有意识到它们发生了。

所以试着预先创建你的面板列表,然后看看它是否有效。(确保你using System.Linq;在顶部)。

    var panels = mainForm.Controls.OfType<Panel>().ToArray();
    foreach (var panel in panels)
    {
        mainForm.Controls.Remove(panel);
    }
于 2013-07-24T02:32:48.230 回答