故事的起因:因為需要在每次載入表單時,刪除掉以前遺留的控制項(控制項為動態產生),故寫下如下方法
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迴圈的條件變了 這樣就是每次刪除最後一個控制項 就可以解決這個問題
最後 可能其他的一些比如字串操作中 也會有這個問題:
再迴圈刪除一個東西的時候 它的總數會變化,所有索引也就會不可靠,當然 使用一些其他的方法也可以完成,我個人覺得這樣是最簡單的 。
在此記錄 以協助他人和備忘.