你好!
我在tabcontrol的每个tabpage中有11个面板,想要删除10个面板。所以我写了这段代码:
var PnlsToRemove = tabControl.SelectedTab.Controls.OfType<Panel>()
.Where(p => !p.Name.StartsWith("BasePanel"));
foreach (var pnl in PnlsToRemove)
pnl.Dispose();
但是在跟踪之后我想知道删除订单是备用的!!!
意味着当上面的代码运行时,只有面板0,2,4,6,8,10将被删除而其他面板仍然存在
所以我应该把我的代码放在循环中以交替删除面板,如下所示:
while (tabControl.SelectedTab.Controls.OfType<Panel>().Count() != 1)
{
var PnlsToRemove = tabControl.SelectedTab.Controls.OfType<Panel>()
.Where(p => !p.Name.StartsWith("BasePanel"));
foreach (var pnl in PnlsToRemove)
pnl.Dispose();
}
在这种情况下(对于10个面板)while()循环4次以移除所有面板。
注意:我的所有面板都存在于“PnlsToRemove”中,并且在foreach中执行“PnlsToRemove”时会出现此错误。
那么,我的代码有什么问题???
为什么foreach()从下一个面板跳转???
我认为每件事都很清楚!
答案 0 :(得分:5)
当你从列表中删除面板时,底层集合正在变异,这显然反映在“foreach”看到的值中。解决方案是将值存储到新集合中并对其进行迭代。您应该可以通过在PnlsToRemove的定义中添加“.ToList()”来实现此目的