删除控件Programaticaly不按预期工作!

Meh*_*hdi 2 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();
Run Code Online (Sandbox Code Playgroud)

但在追踪之后,我想知道删除订单是替代!!!
意味着当上面的代码运行时,只有面板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();
    }
Run Code Online (Sandbox Code Playgroud)

在这种情况下(对于10个面板)while()循环4次以移除所有面板.

注意:我的所有面板都存在于"PnlsToRemove"中,并且在foreach中执行"PnlsToRemove"时会出现此错误.

那么,我的代码有什么问题?
为什么foreach()从下一个面板跳转???

我觉得每件事都很清楚!

Cur*_*her 5

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

  • 许多LINQ方法导致延迟评估,这意味着如果他们不需要,他们将不会复制基础枚举.想象一下,你有一个数组,而不是复制它,你只需记住一个索引."获取下一个元素"操作将递增索引并返回数组中的下一个值.我们从元素零开始.它返回并且索引更新为1.但是现在你要从数组中删除元素零,所以当前索引的是过去的索引二.等等 (2认同)