清除数据表时_rowID 未重置

时间:2021-06-07 20:12:01

标签: vb.net datatable row extension-methods

我正在使用一个名为 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})
    

1 个答案:

答案 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)