我有一个表格(C#)和几个面板。 在一个面板上,我放了一个按钮,一旦单击它就会删除表格上的所有面板。 这是我的代码:
mainForm = (MainForm)this.FindForm();
foreach (Control c in mainForm.Controls)
{
if (c is Panel)
{
mainForm.Controls.Remove(c);
this.Refresh();
}
}
问题是:它在mainForm.Controls上找不到任何面板 我该如何解决?谢谢。
答案 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
并不总是取代LINQ
,for(int i = mainForm.Controls.Count - 1; i >= 0; i--){
if(mainForm.Controls[i] is Panel){
mainForm.Controls.RemoveAt(i);
}
}
并不总是最好的。此方法不需要任何其他执行来从您的集合中选择项目,订购您的集合和内存以保存一些额外的变量或引用:
{{1}}