You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中DataRow[]数组行删除无效问题求助

解决DataRow删除后未从DataTable真正移除的问题

我来帮你搞定这个问题,你遇到的情况其实是对DataRow.Delete()的工作机制,以及DataTable行状态的理解有点偏差,或者可能是查看记录数的方式不对。

问题原因分析

你通过data.Select().OrderBy(x => x["UserName"]).ToArray()得到的rows数组,里面的每个DataRow确实是原DataTable的引用——也就是说,修改数组里的行,会同步影响原DataTable。但这里有两个容易踩坑的点:

  1. DataRow.Delete()并不是立刻从DataTable中移除该行,而是把该行的状态标记为Deleted。此时data.Rows.Count仍然会包含这行(因为只是标记待删除,还没提交变更)。
  2. 如果你查看的记录数是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:33:14