You need to enable JavaScript to run this app. VB.NET清除DataTable后_rowID不重置及Dispose后DataGridView残留数据问题
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET清除DataTable后_rowID不重置及Dispose后DataGridView残留数据问题

问题原因&解决方案

1. 新加载行的_rowID从1001开始累加

你通过反射读取的_rowID是DataRow的内部私有字段,仅用于记录行实例在所属DataTable整个生命周期的唯一标识,并不是当前数据集的行序号。
你之前调用的DT.Clear()、Columns.Clear()、Rows.Clear()仅清空了数据存储,不会重置DataTable内部的行ID计数器,所以新行的ID会接续之前的最大值增长。
解决方法:清空数据时直接销毁旧实例,重新实例化DataTable即可重置计数器:

If DT IsNot Nothing Then
    DT.Dispose()
End If
DT = New DataTable()

2. 调用Dispose后DataGridView仍显示旧数据

你的代码存在对象引用不匹配的问题:你Dispose的是局部DT变量,但后续加载数据、绑定到DataGridView用的是GlobalDataTable全局实例,旧的全局实例没有被重置,绑定后自然显示旧数据。
修正逻辑如下:

' 先重置全局DataTable
If GlobalDataTable IsNot Nothing Then
    GlobalDataTable.Dispose()
End If
GlobalDataTable = New DataTable()

' 加载新数据
qry = "SELECT * FROM " & "[" & myAccessTable & "]"
Dim cmd1 As New OleDbCommand(qry, cn)
Dim dr As OleDbDataReader = cmd1.ExecuteReader
GlobalDataTable.Load(dr)

' 绑定到DataGridView前先移除旧的同名称控件(如果每次新建控件的话)
If Controls.ContainsKey("dgv1") Then
    Controls.RemoveByKey("dgv1")
End If
Dim dgv1 As New DataGridView
dgv1.Name = "dgv1"
dgv1.DataSource = GlobalDataTable.DefaultView
' 其余dgv属性配置代码保留即可

如果你不需要每次新建DataGridView控件,也可以通过重置DataSource的方式刷新数据,无需重建控件:

dgv1.DataSource = Nothing
dgv1.DataSource = GlobalDataTable.DefaultView

内容的提问来源于stack exchange,提问作者user15535192

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 05:45:01