.net 清除上下文菜单中的所有项

.net 清除上下文菜单中的所有项,.net,winforms,contextmenu,.net,Winforms,Contextmenu,我正试图通过删除所有项目并重新添加新项目来刷新我的上下文菜单控件中的项目列表。我遍历所有项目以取消其单击事件并处理它们,然后清除列表,如下所示: var menuItems = rightClickMenu.MenuItems; foreach (MenuItem menuItem in menuItems) { menuItem.Click -= menuItem_Click; menuItem.Dispose(); } menuItems.Clear(); 但是,当我这样做

我正试图通过删除所有项目并重新添加新项目来刷新我的
上下文菜单
控件中的项目列表。我遍历所有项目以取消其
单击
事件并处理它们,然后清除列表,如下所示:

var menuItems = rightClickMenu.MenuItems;
foreach (MenuItem menuItem in menuItems)
{
    menuItem.Click -= menuItem_Click;
    menuItem.Dispose();
}
menuItems.Clear();

但是,当我这样做时,会删除一些项,但随后我会以某种方式获得
menuItem
null
,即使我100%确定集合不包含任何null值。发生了什么事?

您正在修改foreach循环中的集合,这是不允许的。而是创建集合的副本并将其处置

var menuItems = rightClickMenu.MenuItems.Cast<MenuItem>().ToArray();
foreach (MenuItem menuItem in menuItems)
{
    menuItem.Click -= menuItem_Click;
    menuItem.Dispose();
}
rightClickMenu.MenuItems.Clear();
var menuItems=右键单击menu.menuItems.Cast().ToArray();
foreach(菜单项中的菜单项中的菜单项)
{
menuItem.Click-=menuItem\u Click;
menuItem.Dispose();
}
右键单击Menu.MenuItems.Clear();

它可以工作,谢谢!经过一些研究,似乎对项目调用
Dispose
会将其从菜单中删除。。。但是,这不应该使枚举数无效吗?@AndrewSun不,理想情况下,它应该抛出
invalidoOperationException
,这可能是框架开发人员忘记的。对
列表尝试相同的操作
您将得到一个异常:)