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

VB.NET中如何实现List转DataTable再绑定到DataGridView

实现List转DataTable并绑定到DataGridView的完整流程

核心问题修正与优化方向

你的现有代码存在冗余的列创建逻辑(Form1_Load和BindItemDetail重复初始化DataTable列),且未实现List到DataTable的转换逻辑。以下是完整的改造方案:

1. 新增通用List转DataTable方法

在DataControl类中添加通用转换方法,利用反射自动根据实体类属性生成DataTable列并填充数据:

Public Class DataControl
    Public Shared Function CreateDataTableDynamic(ByVal field() As String) As DataTable
        Dim i As Integer
        Dim dtTable As New DataTable("MyTable")
        For i = 0 To field.GetUpperBound(0)
            dtTable.Columns.Add(New DataColumn(field(i)))
        Next i
        Return dtTable
    End Function

    ' 新增:通用List转DataTable方法
    Public Shared Function ListToDataTable(Of T)(ByVal list As List(Of T)) As DataTable
        Dim dt As New DataTable()
        ' 获取实体类的所有公共属性
        Dim properties = GetType(T).GetProperties()
        
        ' 为DataTable创建对应列
        For Each prop In properties
            dt.Columns.Add(prop.Name, prop.PropertyType)
        Next
        
        ' 遍历List填充DataTable行
        For Each item In list
            Dim row = dt.NewRow()
            For Each prop In properties
                row(prop.Name) = If(prop.GetValue(item) IsNot Nothing, prop.GetValue(item), DBNull.Value)
            Next
            dt.Rows.Add(row)
        Next
        
        Return dt
    End Function
End Class

2. 重构Form1逻辑,完成完整流程

修改Form1中的方法,移除冗余代码,实现从List创建、转换到绑定的完整流程:

Public Class Form1
    Private _myTable As New DataTable()
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' 初始化并绑定数据
        BindItemDetailList()
    End Sub

    ' 完整流程:创建List -> 转DataTable -> 绑定到DataGridView
    Private Sub BindItemDetailList()
        ' 1. 创建测试数据List
        Dim itemList As New List(Of Item)()
        itemList.Add(New Item() With {.No = 1, .CodeProduct = "PROD001"})
        itemList.Add(New Item() With {.No = 2, .CodeProduct = "PROD002"})
        itemList.Add(New Item() With {.No = 3, .CodeProduct = "PROD003"})

        ' 2. 将List转换为DataTable
        _myTable = DataControl.ListToDataTable(itemList)

        ' 3. 绑定到DataGridView
        BindItemDetail()
    End Sub

    Private Sub BindItemDetail()
        ' 清空现有列避免重复添加
        Grid.Columns.Clear()
        
        ' 自动生成列(也可保留手动添加列的逻辑,二选一即可)
        Grid.AutoGenerateColumns = True
        Grid.DataSource = _myTable

        ' 如果需要手动定义列样式,取消下面注释并关闭AutoGenerateColumns
        ' Grid.AutoGenerateColumns = False
        ' AddColumnsProgrammatically()
        ' Grid.DataSource = _myTable
    End Sub

    ' 手动添加DataGridView列的方法(可选)
    Private Sub AddColumnsProgrammatically()
        Dim Col1 = New DataGridViewTextBoxColumn()
        Col1.HeaderText = "序号"
        Col1.Name = "Column1"
        Col1.DataPropertyName = "No"

        Dim Col2 = New DataGridViewTextBoxColumn()
        Col2.HeaderText = "产品编码"
        Col2.Name = "Column2"
        Col2.DataPropertyName = "CodeProduct"

        Grid.Columns.AddRange(New DataGridViewColumn() {Col1, Col2})
    End Sub

    ' 保留原填充方法(可选,用于手动添加数据)
    Private Sub FillDataTable(iRow As Integer, ByVal Codeproduct As String)
        Dim row As DataRow = _myTable.NewRow()
        row("No") = iRow
        row("CodeProduct") = Codeproduct
        _myTable.Rows.Add(row)
        ' 更新绑定
        Grid.DataSource = Nothing
        Grid.DataSource = _myTable
    End Sub
End Class

Public Class Item
    Public Property No() As Integer
    Public Property CodeProduct() As String
End Class

关键说明

  • 通用转换方法:ListToDataTable利用反射实现了任意实体类List到DataTable的转换,无需手动指定列名,复用性更高。
  • 避免重复列:绑定前清空DataGridView的现有列,或使用AutoGenerateColumns=True自动生成列,防止重复添加列。
  • 数据更新:如果后续需要手动添加数据(如调用FillDataTable),需重新设置DataSource触发更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:35:33