【问题标题】:DataTable Delete Row and AcceptChangesDataTable 删除行和 AcceptChanges
【发布时间】:2013-10-22 09:18:36
【问题描述】:

数据表 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”行被删除了。

我的代码有问题吗?

【问题讨论】:

  • 我认为当 type==TargetType 并且它删除该行时,您应该将 i 的值减 1,以便当它删除 i=0 时,1=1 处的行移动到 i= 0 然后它会检查并删除该行,如果 i=0 处的行删除,则需要再进行一次检查,而不是递减,您应该设置 i=0 的值。

标签: c# datatable


【解决方案1】:

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

但是,请记住:

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

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

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

DataRow.RowState
DataRow.Delete

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      相关资源
      最近更新 更多