0

我在下面编写的代码将正确地进行循环迭代。它根据条件测试正确的行,添加到“辅助”数据表并按预期从“主”中删除。但是,在循环的第二次迭代中,我收到以下错误:

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. 使用 aFor-Loop并向后迭代项目,通过索引删除行或
  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 可能会以不同的方式更改原始内容,但我只是想通过示例来展示。

类风湿关节炎

于 2014-09-27T21:55:34.610 回答