【问题标题】:Exception when Interating through ListBox.Items迭代 ListBox.Items 时出现异常
【发布时间】:2012-07-23 05:57:59
【问题描述】:

如果列表框中没有选择任何项目,则代码可以正常工作。

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

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

编辑:我在寻找类似 ListBoxItem.IsSelected 的东西,但它不存在。

【问题讨论】:

  • 你确定//do nothing 对项目集合没有任何作用吗?
  • 是的,事实上,在删除 if 子句中的所有代码后,错误仍然可以重现。
  • 如果没有选择它也会抛出。
  • 如果我选择一个项目然后取消选择它,就会抛出异常。如果我不选择/取消选择任何项目,则不会引发异常。奇怪的行为,我认为这是 WinForm 库中的一个错误。
  • 我创建了一个带有列表框和按钮的表单。 LB 填充了一些项目,并且按钮的 click-Handler 执行上面的代码。即使我从未选择任何项目,也会引发交互。

标签: c# .net winforms listbox iteration


【解决方案1】:

我可以重现该问题。对SelectedItems 的访问似乎正在改变Items,而不是对Contains 的调用。它不应该那样做。我暂时没有解释。

解决方法:

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

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

【讨论】:

  • 无需制作完整副本...您可以在迭代之外创建一个新引用:ListBox.SelectedObjectCollection selectedItems = listBoxFiles.SelectedItems;
  • @drumboog - 新参考不起作用。我必须创建一个完整的副本(Eric 的解决方法)。
  • 是的,引用仍然适用于同一个集合。 (如预期)
  • @Robin Maben - 参考不起作用。 SelectedItems 的 get-accessor 似乎在做一些奇怪的事情。
  • 这不是假设或意见,确实尝试过。
猜你喜欢
  • 2021-10-04
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多