已修改此枚举器绑定的列表

时间:2013-09-22 18:58:38

标签: vb.net for-loop enumeration

我在这里有一些代码,在下一个声明中,它给了我一个错误说:

  

此枚举器绑定的列表已被修改。只有在列表没有更改时才能使用枚举器。

我真的不知道如何进一步解释这个问题,但如果你需要我,我可以试试。

For Each itemChecked In storedAuthorsListbox.CheckedItems
  Dim selectedAuthor As String = storedAuthorsListbox.SelectedItem.ToString()
  Dim authorFile As String = "Authors\" & itemChecked.ToString()
  Dim document As XmlReader = New XmlTextReader(authorFile)

  metaInfo &= "[Author]" & vbNewLine

  While (document.Read())
    Dim type = document.NodeType
    If (type = XmlNodeType.Element) Then
      If (document.Name = "Name") Then
        metaInfo &= "Name=" & document.ReadInnerXml.ToString() & vbNewLine
      ElseIf (document.Name = "Website") Then
        metaInfo &= "Website=" & document.ReadInnerXml.ToString() & vbNewLine
      ElseIf (document.Name = "Notes") Then
        metaInfo &= "Notes=" & document.ReadInnerXml.ToString() & vbNewLine
      End If
    End If
  End While
  document.Close()
Next

1 个答案:

答案 0 :(得分:5)

某些代码在迭代时会改变storedAuthorsListbox。该代码在代码段中不可见。确保发布的代码没有在工作线程中运行,这是不合法的。它肯定像你在工人中运行的那种代码一样嘎嘎作响。

通用解决方案是制作项目的副本并从该副本而不是控件中工作:

    Dim copy = storedAuthorsListBox.SelectedItems.OfType(Of String)().ToList()
    For Each itemchecked In copy
        '' etc..
    Next

如果在工作线程中运行,则将副本传递给worker。