InvalidOperationException with ToolStripDropDown
本文关键字:ToolStripDropDown with InvalidOperationException | 更新日期: 2023-09-27 18:25:31
我想从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);
}
}
谢谢你给我的任何帮助!
枚举集合时不能更改集合。
这里有一个更好的方法:
main.favouritesToolStripMenuItem.DropDownItems.Remove(
items.Items.OfType<ToolStripMenuItem>().FirstOrDefault(
item => item.Text == listBox1.SelectedItem.ToString()));
正如user1512185所指出的,这将删除第一个匹配元素,但据我所知,这无论如何都是你的意图。
发生这种情况是因为您正在修改要枚举的集合。从集合中删除项后,任何现有枚举器都将失效。
您可以:
1) 修改集合后退出循环
2) 通过将.ToList()附加到集合的一个副本来遍历该副本
3) 使用for循环手动迭代。请注意,您必须了解修改集合将如何与迭代器/索引变量交互。如果您不小心,您可能会得到超出范围的索引异常,或者跳过从未打算跳过的元素。
在foreach
循环中同时迭代同一集合时,不能从集合中删除项。