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”行被删除了。
我的代码有问题吗?
答案 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循环将触发异常
见
答案 1 :(得分:1)
Ya,您的代码中存在问题。你应该在for循环之前调用DT.AcceptChanges()
方法。它会更改从Added
添加到Unchanged
的所有行的rowstate。现在,如果您调用Delete
方法,它将不会从数据表中删除它,直到您调用AcceptChanges
方法,并且您的索引将保持不变并且不指向下一行。
如果行的RowState为Added
,则RowState变为Detached
,当您调用AcceptChanges时,该行将从表中删除。