2

数据表 DT

num     type    name
===================================
001     A       Peter
002     A       Sam
003     B       John

public static void fun1(ref DataTable DT, String TargetType)
{
    for (int i = 0; i < DT.Rows.Count; i++)
    {
        string type = DT.Rows[i]["type"];

        if (type == TargetType)
        {
            /**Do Something**/
            DT.Rows[i].Delete();
        }
    }
    DT.AcceptChanges();
}

我的函数根据 TargetType 获取数据表中的特定数据行,并使用它们的信息来做某事。读取数据行(匹配目标类型)后,将被删除。

但是,该行在 .Delete() 执行后立即被删除,因此下一行(按 i)的位置不正确。

例如,如果 TargetType 为 A。当 i=0 时,执行 .Delete 后删除“Peter”行。然后当 i=1 时,我想它会找到“Sam”行,但实际上它位于“John”行,因为“Peter”行被删除了。

我的代码有问题吗?

4

2 回答 2

2

不,Delete 方法不会从Rows集合中删除该行。它用Deleted RowState. 在调用AcceptChanges.
因此,在正常的 for 循环中,元素的数量没有副作用

但是,请记住:

在调用 Delete 之后,对 now Deleted 行的任何访问都会引发异常。

 DT.Rows[i].Delete();
 string test = DT.Rows[i][0].ToString(); // Will raise an exception

并且,根据 MSDN,内部带有删除的 foreach 循环将触发异常

DataRow.RowState
DataRow.Delete

于 2013-10-22T09:21:12.060 回答
1

是的,你的代码有问题。DT.AcceptChanges()您应该在 for 循环之前调用方法。它会将添加的所有行的行状态从Added更改为Unchanged。现在,如果您调用该Delete方法,它不会从数据表中删除它,直到您调用该AcceptChanges方法,并且您的索引将保持不变并且不指向下一行。

如果该行的 RowState 为Added,则当您调用 AcceptChanges 时,RowState 变为Detached并从表中删除该行。

于 2014-09-04T16:50:16.093 回答