2011-12-12 65 views
1

我有一個菜單,我禁用某些組的某些選項。它是大約10個輸入的下拉菜單。當我像這樣運行RemoveAt(索引)刪除菜單中的每個替代項目,而不是索引

menuMain.Items[0].ChildItems.RemoveAt(0); 
menuMain.Items[0].ChildItems.RemoveAt(1); 
menuMain.Items[0].ChildItems.RemoveAt(2); 
menuMain.Items[0].ChildItems.RemoveAt(3); 
menuMain.Items[0].ChildItems.RemoveAt(4); 
menuMain.Items[0].ChildItems.RemoveAt(5); 

代碼,這意味着我要刪除這一個組前6項,我在項目沒有拿到5異常,稱該指數超出範圍。

我發現上面的代碼刪除菜單中的每一個其他項目,而不是被引用的項目。

removes 0th item 
removes 2nd item 
removes 4rd item 
... 
removes 10th item 
removes 12th item (index not found) 

有沒有人知道它爲什麼會這樣?

注:我查了一下在調試模式下的代碼,它指向正確的菜單項是奇數和偶數,它不通過2.

回答

6

是跳躍 - 想象一下,你最初有一個項目[a, b, c, d, e, f, g, h, i, j, k, l, m]

現在您撥打RemoveAt(0)。這刪除了第一項(a),讓你與[b, c, d, e, f, g, h, i, j, k, l, m]

現在您致電RemoveAt(1)。這刪除第二個剩餘的項目(c),留下[b, d, e, f, g, h, i, j, k, l, m]

現在您致電RemoveAt(2)。這刪除了第三個剩餘的項目(e),留給您: [b, d, f, g, h, i, j, k, l, m]

...等

的問題是,你在列表想着指標 - 不經過「清除爲止」。如果要刪除的第一條目6中,可以使用:

for (int i = 0; i < 6; i++) { 
    menuMain.Items[0].ChildItems.RemoveAt(0); 
} 
+0

你是天才!有什麼治療,但我可以使用'menuMain.Items [0] .ChildItems.RemoveAt(0);'5次,它會刪除前5個條目。有更好的解決方案 –

+1

@Thecrocodilehunter:你可能想要尋找類似'RemoveRange'的東西 - 它取決於從'ChildItems'返回的類型。 –

+0

這正是我所做的。謝謝! –

2

當你在索引0處的第二元件(索引1)除去所述第一元件(childItem)在索引0

取代它的​​位置

嘗試以相反的順序移除它們。

menuMain.Items[0].ChildItems.RemoveAt(5); 
menuMain.Items[0].ChildItems.RemoveAt(4); 
+0

+1另一個很好的答案。在我的實際問題,我不得不刪除約20項,所以我使用循環方法。 –

1

開始從5下降到0。當你刪除項0,這是在地方1移動的地方爲0的項目,所以未來刪除調用刪除第二項。