【问题标题】:InvalidOperationException with ToolStripDropDown带有 ToolStripDropDown 的 InvalidOperationException
【发布时间】:2014-10-03 23:02:43
【问题描述】:

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

在 mscorlib.dll 中发生了“System.InvalidOperationException”类型的未处理异常

附加信息:集合已更改。枚举操作可能无法执行。

我的代码:

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

感谢我能得到的任何帮助!

【问题讨论】:

    标签: c# vb.net


    【解决方案1】:

    枚举时不能更改集合。

    这是一个更好的方法:

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

    正如 user1512185 指出的那样,这将删除第一个匹配元素,但据我所知,这是你的意图。

    【讨论】:

    • 这只会删除列表中与该条件匹配的第一个元素,它可能旨在删除所有匹配该条件的实例。
    【解决方案2】:

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

    您可以:

    1) 修改集合后退出循环

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-12
        • 2011-11-08
        • 1970-01-01
        相关资源
        最近更新 更多