我正在使用一个名为 DT 的全局数据表,其定义为
Public DT as New DataTable
如果我用 1000 行的数据加载 DT,则使用下面的语法清除
If DT IsNot Nothing Then
DT.Clear()
DT.Columns.Clear()
DT.Rows.Clear()
End If
清除后,我会用一个新的 (qry,cn) 加载 DT,它有 50 行,但是,新数据集的 rowID 值现在是 1001、1002、...、1050。
仅供参考,我通过以下方法获取 rowID:
For Each row As DataRow In DT.Rows
MsgBox(row.RowId)
Next
Public Module ExtensionMethods
<Runtime.CompilerServices.Extension()>
Public Function RowId(ByVal row As DataRow) As Integer
Dim fieldInfo As Reflection.FieldInfo =
row.GetType().GetField("_rowID",
Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
Dim value As Integer = CInt(fieldInfo.GetValue(row))
Return value
End Function
End Module
UDPATE
每次进行新数据查询/连接以重新加载 DT 和 DataGridView 时使用的代码。在从不同文件加载新数据(连接、查询)之前使用 DT.Dispose 不会从 DataGridView 中删除以前的数据。
If DT IsNot Nothing Then
DT.Dispose()
End If
qry = "SELECT * FROM " & "[" & myAccessTable & "]"
Dim cmd1 As New OleDbCommand(qry, cn)
Dim dr As OleDbDataReader = cmd1.ExecuteReader
GlobalDataTable.Load(dr)
Dim dgv1 As New DataGridView
dgv1.Name = "dgv1"
dgv1.DataSource = GlobalDataTable.DefaultView
dgv1.AutoSize = True
dgv1.ScrollBars = ScrollBars.Both
dgv1.DefaultCellStyle.ForeColor = Color.Black
dgv1.DefaultCellStyle.BackColor = Color.White
dgv1.DefaultCellStyle.SelectionForeColor = Color.Blue
dgv1.DefaultCellStyle.SelectionBackColor = Color.Gray
dgv1.ScrollBars = ScrollBars.Both
dgv1.Dock = DockStyle.Fill
dgv1.Font = New System.Drawing.Font("Lucida Sans Typewriter", 8)
dgv1.GetType.InvokeMember("DoubleBuffered", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.SetProperty, Nothing, dgv1, New Object() {True})
答案 0 :(得分:0)
此答案适用于当打开不同的 Excel 时,开发人员希望重新填充全局数据表,并调用隐藏的唯一 ID 列。隐藏 ID 列可用于在替换 DT 中的元素之前进行排序,以及在过滤后从 DT 中筛选出行值:
‘If global DataTable is full, clear it
If DT IsNot Nothing Then
DT.Clear()
DT.Columns.Clear()
End If
‘Setup your own autoincrement field called my _myID (which is hidden in DT)
Dim col As New DataColumn
col.DataType = System.Type.GetType("System.Int32")
col.AutoIncrement = True
col.AutoIncrementStep = 1
col.ColumnMapping = MappingType.Hidden
col.ColumnName = "_myID"
DT.Columns.Add(col)
‘Fetch NumInputFields, and InputFieldNames arrays from Excel file, then populate DT
numaddedcolumns = 0
For j = 0 To NumInputFields - 1
iscolumnexist = False
Try
If DT.Columns.Contains(InputFieldNames(j + 1)) Then
iscolumnexist = True
End If
Catch ex As Exception
End Try
If iscolumnexist = False Then
DT.Columns.Add(InputFieldNames(j + 1), GetType(Object))
End If
If iscolumnexist = True Then
numaddedcolumns += 1
InputFieldNames(j + 1) &= "_" & numaddedcolumns
DT.Columns.Add(InputFieldNames(j + 1), GetType(Object))
End If
Next
Dim workrow As DataRow
For i = 1 To NumInputObjects
workrow = DT.NewRow()
‘You have to initially fill an AutoIncrement field with integer values inside the loop. So do this before looping through all input fields, for this row.
workrow("_myID") = i
For j = 1 To NumInputFields
workrow(j) = ExcelDataArray(i, j)
Next
DT.Rows.Add(workrow)
Next
‘Set AutoIncrementSeed to the row count of the data just added
DT.Columns("_myID").AutoIncrementSeed = DT.Rows.Count
‘Populate a DataGridView with data from DT (with the autoincrement ID column hidden)
Dim dgv1 As New DataGridView
dgv1.Name = "dgv1"
With dgv1
.AutoGenerateColumns = True
.DataSource = DT
.Refresh()
.AutoSize = True
.ScrollBars = ScrollBars.Both
.DefaultCellStyle.ForeColor = Color.Black
.DefaultCellStyle.BackColor = Color.White
.DefaultCellStyle.SelectionForeColor = Color.Blue
.DefaultCellStyle.SelectionBackColor = Color.Gray
.ScrollBars = ScrollBars.Both
.Dock = DockStyle.Fill
.Font = New System.Drawing.Font("Lucida Sans Typewriter", 8)
.GetType.InvokeMember("DoubleBuffered", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.SetProperty, Nothing, dgv1, New Object() {True})
End With
‘Finally, as usual, add the DataGridView to Form1, or another control.
Form1.Controls.Add(dgv1)