2011-12-29 3 views
-1

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

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 

ответ

0

решаемый путем добавления:

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 
4

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

+0

проблема решена, я только добавил этот код до цикла xControl.DataBindings.Clear() –

2

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

 For i As Integer = 0 To oDictionary.Count - 1 
     Dim sKey = m_oDictionary.ElementAt(i).Key 
     m_oDictionary.Remove(sKey) 
     Next 
0
 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 
0

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

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 
Смежные вопросы