我有一个菜单,我正在禁用某些群组的某些选项。它是下拉菜单,大约有10个entriees。当我运行这样的代码时
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。
答案 0 :(得分: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);
}
答案 1 :(得分:2)
当您在索引0处删除第一个元素(childItem)时,第二个元素(索引1)将在索引0处取代。
尝试以相反的顺序删除它们。
menuMain.Items[0].ChildItems.RemoveAt(5);
menuMain.Items[0].ChildItems.RemoveAt(4);
答案 2 :(得分:1)
从5开始减少到0.当您移除项目0时,位置1的项目移动到0,所以下一个删除调用将删除第二个项目。