Ошибка VBNet: коллекция была изменена;операция перечисления может не выполняться - PullRequest
0 голосов
/ 29 декабря 2011

Вот что произошло: при загрузке формы моего приложения я создал фоновый рабочий для связывания коллекции ( записей из базы данных, заполненной в наборе данных ) на моем элементе управления. но проблема в том, что когда я обновляю записи в базе данных, выдается ошибка, если я снова запускаю эту процедуру.

    If xControl.InvokeRequired Then
        Dim MyDelegate As New InitializeDataBinding_Delegate(AddressOf InitializeDataBinding)
        Invoke(MyDelegate, New Object() {xControl, xQuery, xPrimaryKey}) ' ERROR HERE SAYING: Collection was modified; enumeration operation may not execute.
    Else
        Using ds As DataSet = New DataSet()
            Using dbAdapter As MySqlDataAdapter = New MySqlDataAdapter(xQuery, ConnectionClass.ConnectionString)
                dbAdapter.Fill(ds)
            End Using

            Dim dvm As DataViewManager = New DataViewManager(ds)
            Dim iDataList As DataView = dvm.CreateDataView(ds.Tables(0))
            For Each iBind As Binding In xControl.DataBindings
                xControl.DataBindings.Remove(iBind)
            Next
            xControl.DataBindings.Add("EditValue", iDataList, xPrimaryKey)
            xControl.Properties.DataSource = iDataList
            xControl.EditValue = Nothing
            txtStatus.Text = "Ready"
        End Using
    End If

Ответы [ 5 ]

5 голосов
/ 29 декабря 2011

Вы должны избегать обновления в коллекции, повторяя его, используя For Each.Используйте простой цикл For вместо For Each.

2 голосов
/ 13 декабря 2013

Вы не можете использовать цикл For Each для удаления элементов из словаря или KeyValuePair, но вы можете использовать обычный цикл for, получить ключ и использовать ключ для удаления элемента из списка.

      For i As Integer = 0 To oDictionary.Count - 1
        Dim sKey = m_oDictionary.ElementAt(i).Key
        m_oDictionary.Remove(sKey)
      Next
1 голос
/ 18 января 2012

Решено добавлением:

xControl.DataBindings.Clear()

If xControl.InvokeRequired Then
    Dim MyDelegate As New InitializeDataBinding_Delegate(AddressOf InitializeDataBinding)
    Invoke(MyDelegate, New Object() {xControl, xQuery, xPrimaryKey}) ' ERROR HERE SAYING: Collection was modified; enumeration operation may not execute.
Else
    Using ds As DataSet = New DataSet()
        Using dbAdapter As MySqlDataAdapter = New MySqlDataAdapter(xQuery, ConnectionClass.ConnectionString)
            dbAdapter.Fill(ds)
        End Using

        xControl.DataBindings.Clear() 'HERE

        Dim dvm As DataViewManager = New DataViewManager(ds)
        Dim iDataList As DataView = dvm.CreateDataView(ds.Tables(0))
        For Each iBind As Binding In xControl.DataBindings
            xControl.DataBindings.Remove(iBind)
        Next
        xControl.DataBindings.Add("EditValue", iDataList, xPrimaryKey)
        xControl.Properties.DataSource = iDataList
        xControl.EditValue = Nothing
        txtStatus.Text = "Ready"
    End Using
End If
0 голосов
/ 17 сентября 2016

Если вы собираетесь использовать цикл, вам нужно убедиться, что индекс меньше, чем Count, поскольку счетчик уменьшается каждый раз, когда удаляется ключевой элемент:

Dim i As Integer

For i = 0 To dictionary1.Count - 1
    If i <= dictionary1.Count - 1 Then
        Dim sKey = dictionary1.ElementAt(i).Key
        dictionary1.Remove(sKey)
    End If
Next
0 голосов
/ 10 февраля 2015
        Dim index As Integer = 0
opnieuw:
        For Each F In openbestand.file
            If F.Contains("~$") Then
                openbestand.file.Remove(openbestand.file(index))
                openbestand.path.Remove(openbestand.path(index))
                GoTo opnieuw
            Else
                index = (index + 1)
            End If
    Next
...