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
相关产品推荐
相关产品推荐

