故事的起因:因为需要在每次加载窗体时,删除掉以前遗留的控件(控件为动态生成),故写下如下方法
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循环的条件变了 这样就是每次删除最后一个控件 就可以解决这个问题
最后 可能其他的一些比如字符串操作中 也会有这个问题:
再循环删除一个东西的时候 它的总数会变化,所有索引也就会不可靠,当然 使用一些其他的方法也可以完成,我个人觉得这样是最简单的 。
在此记录 以帮助他人和备忘.