删除同一表单上的其他面板

时间:2013-07-24 02:10:07

标签: c# winforms panel

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

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

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

2 个答案:

答案 0 :(得分:0)

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

因此,请尝试预先创建面板列表,然后查看它是否有效。 (确保你在顶部有using System.Linq;

    var panels = mainForm.Controls.OfType<Panel>().ToArray();
    foreach (var panel in panels)
    {
        mainForm.Controls.Remove(panel);
    }

答案 1 :(得分:0)

如果您想继续使用foreach,则必须反向循环Controls,如果使用for,则必须从最后一个控件循环到foreach(Control c in mainForm.Controls.OfType<Control>().Reverse()) { if (c is Panel) { mainForm.Controls.Remove(c); } } 第一个(逆序):

for

我认为在这种情况下,您应该使用Controls来代替从最后一个索引到第一个索引的foreach。这是任何其他的最佳解决方案。 for并不总是取代LINQfor(int i = mainForm.Controls.Count - 1; i >= 0; i--){ if(mainForm.Controls[i] is Panel){ mainForm.Controls.RemoveAt(i); } } 并不总是最好的。此方法不需要任何其他执行来从您的集合中选择项目,订购您的集合和内存以保存一些额外的变量或引用:

{{1}}