【原创】C# 批量移除容器内控件的问题 循环移除控件

  故事的起因:因为需要在每次加载窗体时,删除掉以前遗留的控件(控件为动态生成),故写下如下方法

    
        private void RemoveAllBut(Control comtrol)  
        {
            for (int i = 0; i <comtrol.Controls.Count; i++)
            {
                Control con=comtrol.Controls[i];  
                if (con is SimpleButton)      //判断控件是否为simpleButton 控件 这是一个DEV控件 相当于Button
                {
comtrol.Controls.RemoveAt(i);
} } }

代码是没有问题的,但是每次执行完成后只会删除其中的一半控件,且是跳着删除的(删除控件1 3 5 7……)

然调试后发现 Controls.RemoveAt 之后,comtrol.Controls.Count也会发生变化,所以 此时的Controls[i] 也不是上次的Controls[i]的那个控件了

这样每次都会隔着一个控件删除

解决办法 :

        private void RemoveAllBut(Control comtrol)  
        {
            for (int i = comtrol.Controls.Count-1; i >=0; i--)  //重点 
{ Control con=comtrol.Controls[i];   if (con is SimpleButton)      //判断控件是否为simpleButton 控件 这是一个DEV控件 相当于Button { comtrol.Controls.RemoveAt(i); } } }

上面已经标示出 for循环的条件变了 这样就是每次删除最后一个控件 就可以解决这个问题

最后 可能其他的一些比如字符串操作中 也会有这个问题:

    再循环删除一个东西的时候 它的总数会变化,所有索引也就会不可靠,当然 使用一些其他的方法也可以完成,我个人觉得这样是最简单的 。

在此记录 以帮助他人和备忘.