RemoveAt(index)删除菜单中的每个备用项而不是索引的项

时间:2011-12-12 15:30:39

标签: asp.net menu menuitem

我有一个菜单,我正在禁用某些群组的某些选项。它是下拉菜单,大约有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。

3 个答案:

答案 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,所以下一个删除调用将删除第二个项目。