0

以下に記述したコードは、ループの反復を適切に実行します。条件に対して正しい行をテストし、「セカンダリ」DataTable に追加し、想定どおりに「マスター」から削除します。ただし、ループの 2 回目の繰り返しで、次のエラーが発生します。

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
4

2 に答える 2

2

列挙中にコレクションを変更することはできません。つまり、アイテムを追加または削除することはできません。この場合、For Eachループ内の DataTable から DataRow を削除します。

解決策は次のいずれかです

  1. a を使用しFor-Loopてアイテムを逆方向に反復し、インデックスまたは to を介して行を削除します
  2. 別のコレクション (fe a List(Of DataRow)) を使用して、削除する一致する行を に追加します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 
于 2012-09-08T22:26:58.463 に答える
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

したがって、ここで行ったことは、データテーブルを別のコピーに移動し、Distinct "ToTable(True)" を使用してさらに絞り込み/クリーンアップすることでした。

次に、元のデータテーブルを使用してアイテムをマージし、元に追加して、コピーをループします。私のオリジナルには、すべてのアイテムと新しいアイテムが含まれています。あなたの logiv はオリジナルをさまざまな方法で変更する可能性がありますが、例で示したかっただけです。

RA

于 2014-09-27T21:55:34.610 に答える