C#中DataRow[]数组行删除无效问题求助
解决DataRow删除后未从DataTable真正移除的问题
我来帮你搞定这个问题,你遇到的情况其实是对DataRow.Delete()的工作机制,以及DataTable行状态的理解有点偏差,或者可能是查看记录数的方式不对。
问题原因分析
你通过data.Select().OrderBy(x => x["UserName"]).ToArray()得到的rows数组,里面的每个DataRow确实是原DataTable的引用——也就是说,修改数组里的行,会同步影响原DataTable。但这里有两个容易踩坑的点:
DataRow.Delete()并不是立刻从DataTable中移除该行,而是把该行的状态标记为Deleted。此时data.Rows.Count仍然会包含这行(因为只是标记待删除,还没提交变更)。- 如果你查看的记录数是
rows.Length,那这个数组是排序后的静态快照,长度不会因为原DataTable的变化而改变——你需要看data.Rows.Count才是原表的真实记录数。
正确的解决方法
根据你的需求(要让原DataTable的记录数从26变成25),有两种可靠的方式:
方式1:使用DataRow.Delete() + AcceptChanges()(适合后续要同步到数据库的场景)
如果你之后需要用DataAdapter把变更同步回数据库,推荐这种方式,因为它会保留删除的状态信息,方便生成对应的数据库DELETE语句:
Backlog.GetDocAllUsersDataTable data = service.GetDocAllUsersDataTable(string.Empty); // 获取排序后的第一行(用FirstOrDefault避免空引用异常) DataRow rowToDelete = data.Select().OrderBy(x => x["UserName"]).FirstOrDefault(); if (rowToDelete != null) { // 标记该行待删除 rowToDelete.Delete(); // 提交变更,此时该行会从DataTable的Rows集合中彻底移除 data.AcceptChanges(); // 现在data.Rows.Count应该是25了 }
方式2:直接用DataTable.Rows.Remove()(适合不需要同步回数据库的场景)
如果不需要把删除操作同步到数据库,直接移除行更直接,不需要额外调用AcceptChanges():
Backlog.GetDocAllUsersDataTable data = service.GetDocAllUsersDataTable(string.Empty); DataRow rowToDelete = data.Select().OrderBy(x => x["UserName"]).FirstOrDefault(); if (rowToDelete != null) { // 直接从DataTable的行集合中移除该行 data.Rows.Remove(rowToDelete); // 此时data.Rows.Count已经是25了 }
验证要点
- 确认你查看的是
data.Rows.Count而不是rows.Length——rows数组是排序后的快照,不会随原表变化更新长度。 - 如果用
Delete()方案,一定要确保调用了data.AcceptChanges(),否则行只是标记为删除状态,不会从Rows集合中移除。
内容的提问来源于stack exchange,提问作者Nico Florez
相关产品推荐
相关产品推荐

