2012-05-01 2 views
0

У меня есть для каждого цикла, написанного на Visual Basic, который пытается изменить таблицу, через которую выполняется итерация. Это вызывает изменение «» коллекции; операции перечисления не может выполнить»исключение.Как я могу переписать этот цикл Visual Basic.net, чтобы он работал?

Что frastrating о том, что я пытался сделать копии всех объектов, которые я использую и и удаляется только из копии, но исключение еще произошло.

Я знаю, что это связано с тем, что я использовал цикл For Each вместо цикла For или While, но я не мог переписать свой код и заставить его работать (я больше знаком с C#). Вот почему я решил попросить помощь здесь.

Это мой код. Как я могу переписать, чтобы иметь возможность удалить строку, что я хочу, чтобы удалить? Любая помощь и код будет очень признателен!

Dim drAcademicRecord, drSchool As DataRow 
For Each drSchool In dsR.Tables("School").Rows 
    If drSchool("OrganizationName") = "NA" Then 
     For Each drAcademicRecord In dsR.Tables("AcademicRecord").Rows 
      If drAcademicRecord("AcademicRecord_Id") = drSchool("AcademicRecord_Id") Then 
       dsR.Tables("AcademicRecord").Rows.Remove(drAcademicRecord) '<-- This is the line causing my exception 
      End If 
     Next 
    End If 
Next 
+0

vb.net заставляет меня съедать – JonH

+0

Зачем вы перебираете несколько таблиц? Взгляните на DataRelations: http://msdn.microsoft.com/en-us/library/0k21zcyx%28v=vs.100%29.aspx –

+0

Спасибо, я посмотрю на это. Я не писал оригинальный код, поэтому использовал то, что у меня было. – user1179071

ответ

1

Вам не нужно использовать

dsR.Tables("AcademicRecord").Rows.Remove(drAcademicRecord) 

Потому что вы уже получили drAcademicRecord, так что вы можете сразу удалить эту строку на

drAcademicRecord.Delete 

например

For Each drSchool As DataRow In dsR.Tables("School").Select("OrganizationName='NA'") 
    For Each drAcademicRecord As DataRow In dsR.Tables("AcademicRecord").Select("AcademicRecord_Id=" & drSchool("AcademicRecord_Id")) 
     drAcademicRecord.Delete 
    Next 
Next 
+0

Большое спасибо! Это сработало, и я узнал что-то новое. Просто из любопытства, знаете ли вы, почему этот код не генерирует одно и то же исключение, даже если удаление происходит внутри цикла? Еще раз спасибо! – user1179071

+1

После удаления DataTow DataTable будет повторно индексироваться, поэтому, если вы зацикливаете его, используя 'dsR.Tables (« AcademicRecord »). Строки (i)' могут получить доступ к недопустимому индексу, который был удален. Я бы не получил доступ к DataRow с помощью индекса, когда мне нужно добавить или удалить запись, которая может изменить индекс таблицы – Nick

+0

Спасибо за объяснение! – user1179071

3
For i as integer = dsR.Tables("AcademicRecord").Rows.Count - 1 to 0 Step -1 
    If dsR.Tables("AcademicRecord").Rows(i)("AcademicRecord_Id") = drSchool("AcademicRecord_Id") Then 
     dsR.Tables("AcademicRecord").Rows.RemoveAt(i) 
    End If 
Next 
+0

Благодарим за помощь! Правильно ли я предполагаю, что исключение исключается, по существу, отступая назад и всегда имея больше именований для повторения? – user1179071

+1

Нет, исключение исключается из-за того, что вы не используете перечислитель для перемещения коллекции. И, возвращаясь назад, вы избегаете необходимости ручного уменьшения переменной 'i' при удалении элемента. – GSerg

+0

Это имеет смысл. Я действительно ценю твою помощь. – user1179071

Смежные вопросы