DataTable删除Row和AcceptChanges

时间:2013-10-22 09:18:36

标签: c# datatable

DataTable 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获取datatable中的特定数据行,并使用它们的信息来做某事。读取数据行后(与目标类型匹配),它将被删除。

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

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

我的代码有问题吗?

2 个答案:

答案 0 :(得分:2)

不,Delete方法不会从Rows集合中删除该行。它使用Deleted RowState标记。调用AcceptChanges后,该行将从DataTable的集合中删除 因此,在正常的for循环中,对元素的计数没有副作用

但是,请记住:

在调用Delete对现在已删除行的任何访问权限后都会引发异常。

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

并且,根据MSDN,其中包含删除的foreach循环将触发异常

DataRow.RowState
DataRow.Delete

答案 1 :(得分:1)

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

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