以编程方式删除控件不按预期工作!

时间:2009-06-29 15:23:09

标签: c# c#-3.0

你好!
我在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()从下一个面板跳转???

我认为每件事都很清楚!

1 个答案:

答案 0 :(得分:5)

当你从列表中删除面板时,底层集合正在变异,这显然反映在“foreach”看到的值中。解决方案是将值存储到新集合中并对其进行迭代。您应该可以通过在PnlsToRemove的定义中添加“.ToList()”来实现此目的