Asp.net 移除(索引)移除菜单中的每个备用项,而不是索引的项

Asp.net 移除(索引)移除菜单中的每个备用项,而不是索引的项,asp.net,menu,menuitem,Asp.net,Menu,Menuitem,我有一个菜单,我正在禁用某些组的某些选项。这是一个下拉菜单,大约有10个条目。当我运行这样的代码时 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.Rem

我有一个菜单,我正在禁用某些组的某些选项。这是一个下拉菜单,大约有10个条目。当我运行这样的代码时

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。

是-假设您最初有项
[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);
}
for(int i=0;i<6;i++){
menuMain.Items[0].ChildItems.RemoveAt(0);
}

是-假设您最初有项目
[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);
}
for(int i=0;i<6;i++){
menuMain.Items[0].ChildItems.RemoveAt(0);
}

删除索引0处的第一个元素(childItem)时,第二个元素(索引1)将在索引0处就位

尝试按相反的顺序删除它们

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

删除索引0处的第一个元素(childItem)时,第二个元素(索引1)将在索引0处替换

尝试按相反的顺序删除它们

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

从5开始到0。删除项目0时,位于位置1的项目将移动到位置0,因此下一次删除调用将删除第二个项目。

从5开始,直到0。删除项目0时,位于位置1的项目将移动到位置0,因此下一次删除调用将删除第二个项目。

您真是天才!但是治疗方法是什么,我可以使用
menuMain.Items[0].ChildItems.RemoveAt(0)5次,它将删除前5个条目。有更好的解决方案吗?@Thecrocodilehunter:你可能想寻找类似于
RemoveRange
-这取决于
ChildItems
返回的类型。这正是我所做的。谢谢一个词:天才!帮助我解决了我花了很多时间才理解的问题。谢谢你真是天才!但是治疗方法是什么,我可以使用
menuMain.Items[0].ChildItems.RemoveAt(0)5次,它将删除前5个条目。有更好的解决方案吗?@Thecrocodilehunter:你可能想寻找类似于
RemoveRange
-这取决于
ChildItems
返回的类型。这正是我所做的。谢谢一个词:天才!帮助我解决了我花了很多时间才理解的问题。谢谢+另一个很好的答案。在我的实际问题中,我必须删除大约20项,所以我使用循环方法。+1另一个很好的答案。在我的实际问题中,我必须删除大约20项,所以我使用循环方法。