使用ToolStripDropDown的InvalidOperationException

时间:2014-10-03 14:52:07

标签: c# vb.net

我想从ToolStripMenuItem中删除一个项目,但它给了我一个错误

  

未处理的类型' System.InvalidOperationException'发生在mscorlib.dll

     

其他信息:该集合已更改。枚举操作可能无法执行。

我的代码:

ToolStripDropDown items = main.favouritesToolStripMenuItem.DropDown;
foreach(var item in items.Items.OfType<ToolStripMenuItem>()) 
{
    if (item.Text == listBox1.SelectedItem.ToString())
    {
        main.favouritesToolStripMenuItem.DropDownItems.Remove(item);
    }
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

您在枚举时无法更改集合。

这是一种更好的方法:

main.favouritesToolStripMenuItem.DropDownItems.Remove(
    items.Items.OfType<ToolStripMenuItem>().FirstOrDefault(
          item => item.Text == listBox1.SelectedItem.ToString())); 

这会删除第一个匹配元素,因为user1512185指出,但从我收集的内容来看,无论如何这都是你的意图。

答案 1 :(得分:1)

这种情况正在发生,因为您正在修改要枚举的集合。从集合中删除项目后,任何现有的枚举器都将失效。

你可以:

1)修改集合后退出循环

2)通过将.ToList()附加到它来迭代集合的COPY

3)使用for循环手动迭代自己。请注意,您必须了解修改集合将如何与您的迭代器/索引变量进行交互。如果您不小心,可以使索引超出范围异常,或跳过您从未想过的元素。

答案 2 :(得分:0)

当您同时在foreach循环中迭代同一个集合时,无法从集合中删除项目。