0

我想从 DataTable 中删除 DataRows。要删除的行位于数据行列表“wantDelete”中。由于异常,请更正我的代码:

foreach (DataRow dr in myTable.Rows)
{
     if (wantDelete.Contains(dr))
     myTable.Rows.Remove(dr);
}

例外是:

例外

非常感谢你。

4

4 回答 4

5

您不能在枚举期间修改集合,因为 foreach 使用枚举器,而枚举器无法更改基础集合。

因此,您应该使用 a或使用您已预先过滤的for-loop另一个 collection( )。deleteItems

我在您的代码中看到您已经对其进行了预过滤(我假设 wantDelete 是List<DataRow>)

foreach (DataRow dr in wantDelete)
{
     myTable.Rows.Remove(dr);
}

旁注:DataTable如果您使用的是,您知道从 a 中删除行不会在您的 dbms 中删除它们DataAdapter?因此,您需要使用DataRow.Delete().

于 2012-06-20T20:06:22.650 回答
1

在这种情况下不要使用 foreach 循环。使用整数迭代:

for (int I = myTable.Rows.Count - 1; I >= 0; I -= 1) {
   if (wantDelete.Contains(myTable.Rows(I))) {
      myTable.Rows.Remove(myTable.Rows(I));
   }
}
于 2012-06-20T20:08:53.053 回答
1

在迭代它所属的 DataTable 时,您不能删除 DataRow。因此,在迭代另一个 DataRows 列表时存储 DataRows 并将其删除,如下所示:

        List<DataRow> rowsToDelete = new List<DataRow>();
        foreach (DataRow dr in myTable.Rows)
        {
            if (wantDelete.Contains(dr))
            {
                rowsToDelete.Add(dr);
            }
        }

        foreach (var dataRow in rowsToDelete)
        {
            myTable.Rows.Remove(dataRow);   
        }

希望这可以帮助 ...

于 2012-06-20T20:24:48.220 回答
0

您正在循环和删除同一个表..换句话说,删除行后 myTable.Rows 将发生变化,因此您不能在其上使用“循环”。将表复制到另一个表并将其删除。(foreach 应该循环“复制”表并将其从“原始”表中删除)

于 2012-06-20T20:01:35.350 回答