2012-09-08 5 views
0

아래에 작성한 코드는 루프 반복을 올바르게 수행합니다. 조건에 대해 올바른 행을 테스트하고 "보조"DataTable에 추가 한 다음 "마스터"에서 제거합니다. 그러나, 루프의 두 번째 반복에 나는 다음과 같은 오류가 발생합니다 : 여기 Visual Basic의 DataTable을 통해 루핑하는 오류

Collection was modified; enumeration operation might not execute. 

난 당신이 열거하는 동안 컬렉션을 수정할 수 없습니다

  For Each row As DataRow In tblAgencyEdInfo.Rows 
       Dim rDate As DateTime = row.Item("ExpirationDate") 

       If rDate < DateTime.Now Then 
        tblExpEdInfo.ImportRow(row) 
        tblAgencyEdInfo.Rows.Remove(row) 
       End If 
      Next row 

답변

2

을 사용하고있는 코드입니다. 즉, 항목을 추가하거나 제거 할 수 없습니다. 이 경우 For Each 루프의 DataTable에서 DataRow를 제거하려고합니다.

이 솔루션은

에 하나가
  1. For-Loop를 사용하고 뒤로 항목을 반복, 다른 모음 (FE List(Of DataRow))를 사용하여 인덱스를 통해 또는
  2. 에 행을 제거하고 원하는 일치하는 행을 추가입니다 For Each에서 삭제하십시오. 그 후 당신은 그냥이 목록을 반복하고 예를 들어 tblAgencyEdInfo.Rows.Remove(rowToRemove)

호출해야합니다 사용하는 동안

Dim rowsToRemove = New List(Of DataRow) 
For Each row As DataRow In tblAgencyEdInfo.Rows 
    Dim rDate As DateTime = row.Item("ExpirationDate") 
    If rDate < DateTime.Now Then 
     rowsToRemove.Add(row) 
    End If 
Next row 

For Each rowToRemove As DataRow In rowsToRemove 
    tblExpEdInfo.ImportRow(row) 
    tblAgencyEdInfo.Rows.Remove(row) 
Next rowToRemove 
0

위의 사실입니다, 당신은 변경할 수 없습니다. 내가 여기했던 그래서

 ' distinct 
     Dim distinctTable As DataTable = tblProductsForDisplay.DefaultView.ToTable(True) 
     ' get all bundles that contain products in bundles - GetBundleDataByOLLID 
     For Each row As DataRow In distinctTable.Rows 
      Dim myOLLCourseID As Integer = row.Item("OLLCourseID") 
      tblProductsForDisplay.Merge(tblBundles(myOLLCourseID)) 
     Next 

는 고유 "ToTable (True)로"그것도 좁은/정리 필터링하는 데 사용, 다른 복사본에 DataTable을 이동했다.

그런 다음 원본 데이터 테이블을 사용하여 항목을 병합하고 사본을 반복하면서 원본에 추가하십시오. 내 원본에는 이제 모든 항목과 새로운 항목이 추가되었습니다. 로지브가 원본을 다른 방법으로 바꿀 수도 있지만 예제로 보여주고 싶었습니다.

ra

관련 문제