C# 通过ListBox.Items交互时出现异常

C# 通过ListBox.Items交互时出现异常,c#,.net,winforms,listbox,iteration,C#,.net,Winforms,Listbox,Iteration,如果列表框中未选择任何项,则代码正常工作 如果列表框中至少选择了一项,则foreach迭代在计算第一项后中断。该异常为InvalidOperationException,详细信息显示Items集合已被修改 foreach (object item in listBoxFiles.Items) //InvalidOperationException occurs { if (listBoxFiles.SelectedItems.Contains(item)) {

如果列表框中未选择任何项,则代码正常工作

如果列表框中至少选择了一项,则foreach迭代在计算第一项后中断。该异常为InvalidOperationException,详细信息显示Items集合已被修改

foreach (object item in listBoxFiles.Items) //InvalidOperationException occurs
{
    if (listBoxFiles.SelectedItems.Contains(item)) 
    {
        //do nothing
    }
}

编辑:我正在查找类似于ListBoxItem.IsSelected的内容,但它不存在。

我可以重现该问题。对
SelectedItems
的访问似乎正在更改
,而不是对
的调用包含
。它不应该这样做。我现在没有解释

解决方法:

如果检查
SelectedItems
中是否包含
item
,则可以立即迭代
SelectedItems
。另一种选择是在迭代之前复制
SelectedItems
,如下所示:

List<object> selectedItems = new List<object>();
selectedItems.AddRange( listBoxFiles.SelectedItems.OfType<object>() );
List selectedItems=new List();
selectedItems.AddRange(listBoxFiles.selectedItems.OfType());

无需制作完整副本。。。您可以在迭代之外创建一个新引用:
ListBox.SelectedObjectCollection selectedItems=listBoxFiles.selectedItems@drumbog-新引用不起作用。我必须创建一个完整的副本(Eric的解决方法)。是的,引用仍然适用于同一个集合。(正如所料)@Robin Maben-引用不起作用。SelectedItems的get访问器似乎做了一些奇怪的事情。这不是假设或意见,a确实尝试过。你确定
//什么都不做
对项目集合什么都不做吗?是,事实上,在删除if子句中的所有代码后,错误仍然是可复制的。如果未选择任何内容,它也会引发错误。如果我选择一个项目,然后取消选择它,则会引发异常。如果我没有选择/取消选择任何项目,则不会引发异常。奇怪的行为,我认为这是WinForm库中的一个bug。我创建了一个带有列表框和按钮的表单。LB将填充一些项目,按钮的单击处理程序将执行上面的代码。即使我从未选择任何项目,交互也会抛出。