循环删除DataTable.Row中的多行问题

在C#中,如果要删除DataTable中的某一行,大约有以下几种办法:

1,使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(index);可以直接删除行

2,datatable.Rows[i].Delete()。Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除,还可以通过datatable.RejectChanges()回滚,使该行取消删除。

在删除DataTable中的行的时候,每删除一行,DataTable中所有行的索引都会发生改变。在循环删除DataTable.Row的时候不能使用foreach。使用foreach进行循环的时候,是不允许Table有删除和添加操作的。
如果是按某列为条件进行删除,则每删完一行,整个Table的index就会立即发生变化,等于Table已经变成了一个新的表。但是索引却已经加1了。于是会造成第一列永远匹配不到。因此,每删除完一行,要跟着判断第一行是否满足删除条件。

=========================================================

如果要删除DataTable中的多行,应该采用倒序循环DataTable.Rows。因为正序删除时索引会发生变化。

for (int i = dt.Rows.Count - 1; i >= 0; i--)
{
          dtOGBHIS.Rows.RemoveAt(i);
 }

总结:

delete和remove

Delete的使用是 datatable.Rows[i].Delete();

Remove的使用是datatable.Rows.Remove(datatable.Rows[i]);

这两个的区别是,使用delete后,只是该行被标记为deleted,但是还存在,用Rows.Count来获取行数时,还是删除之前的行数.需要使用datatable.AcceptChanges()方法来提交修改.

而Remove方法则是直接删除.

如果在for循环里删除行的话,最好是使用delete方法,不然会出现count变化的情况.循环完后再使用AcceptChanges()方法提交修改,删除掉标记为deleted的行

时间: 2024-08-28 10:36:03

循环删除DataTable.Row中的多行问题的相关文章

shell:删除/保留文件中的指定行

将文件file1中第一行到含有word字符的行删除,并重定向到文件file2: sed  '1,/word/d' file1 > file2 将文件file1中含有word字符的行保留,并重定向到文件file2,-n表示结果不打印到屏幕: sed -n '/word/p' file1 > file2 将文件file1中>=21行的内容删除,-i表示直接将更改保存在file1: sed -i '21,$d'  file1 多个条件用分号隔开: sed  '1,/word1/d;21,$d;

删除PHP配置文件中的注释行

删除空行: sed -i /^[[:space:]]*$/d filename 删除注释行: sed -i '/^;.*/d' filename 仅仅预览的话,去掉-i参数.

Python3基础 使用for循环 删除一个列表中的重复项

镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.------------------------------------------ code: num=[1,2,3,4,5,6,6,7,8] res=[] for each in num : if each not in res : res.append(each) print(res) #有趣有趣,这么写基础的机制与方法,可以写出如此优美的函数 #小甲鱼 强悍 res

循环删除Dictionary集合中为空的Key,其他集合均可改造

/// <summary>/// 移除为空的Key/// </summary>/// <param name="dic"></param>/// <returns></returns>private static Dictionary<string, string> RemoveNullKey(Dictionary<string, string> dic){string keyNames =

C#中删除DataTable中的行的方法

1.在C#中,如果要删除DataTable中的某一行,大约有以下几种办法: •使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(index):可以直接删除行•datatable.Rows[i].Delete().Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除,还可以通过datatable.RejectChanges()回滚,使该行取消

vim技巧4 删除/保留文本中匹配行

vim技巧:如何删除/保留文本中特定的行呢? <ol><a href="/ss/ss/www"> show invisibles</a> <a href="/ss/ssg/gg/ff/"> one world one dream</a> 任务1:只保留<a>标签内的标题,而把其他行都删掉:g/re/d 知识点:使用:global与:delete命令 运行一下命令: /\v\<\ /?\w+

删除datatable的行后,出现“不能通过已删除的行访问该行的信息”的错误,即DeletedRowInaccessibleException

删除datatable的行后,出现"不能通过已删除的行访问该行的信息"的错误 =========================================================== 采用datatable.Rows[i].Delete()删除行后再访问该表时出现出现"不能通过已删除的行访问该行的信息"的错误.原因如下: Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态

JS实现循环删除数组中元素的方法介绍

这篇文章主要给大家介绍了关于Javascript循环删除数组中元素的几种方法,文中给出了详细的示例代码供大家参考学习,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 本文主要跟大家分享了关于Javascript循环删除数组中元素的几种方法,分享出来供大家参考学习,下面来看看详细的介绍: 发现问题 大家在码代码的过程中,经常会遇到在循环中移除指定元素的需求.按照常规的思路,直接一个for循环,然后在循环里面来个if判断,在判断中删除掉指定元素即可.但是实际情况往往不会像预想的那样顺利

删除DataTable重复列,只针对删除其中的一列重复的行

vs2005针对datatable已经有封装好的去重复方法: 1 //去掉重复行 2 DataView dv = table.DefaultView; 3 table = dv.ToTable(true, new string[] { "name", "code" }); 4 5 此时table 就只有name.code无重复的两行了,如果还需要id值则 6 7 table = dv.ToTable(true, new string[] { "id&quo