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

VB.NET中DataTable转List并快速显示到DataGridView的最优方案

VB.NET高效实现DataTable转List并绑定DataGridView的方案

先说明:其实你当前直接把DataTable绑到DataGridView的做法本身就很高效——WinForms的DataGridView对DataTable原生支持很好,自带排序、编辑等功能,性能也拉满。但如果业务上确实需要转成List,这里给你几个简便实用的方案,顺便优化下你现有代码的细节。

一、一定要转List?试试这两种简便方法

1. LINQ快速转换(推荐,简洁高效)

先定义和数据表字段对应的实体类:

Public Class RsdItem
    ' 字段类型请根据数据库实际类型调整
    Public Property NOD As String
    Public Property ITM As String
    Public Property CIA As Double
    Public Property DPR As Double
    Public Property QTY As Integer
    Public Property Total As Double
End Class

然后在你的fillDataGridView1方法里,填充DataTable后直接用LINQ转成List:

' 填充DataTable之后
Dim itemList = dt.AsEnumerable().Select(Function(row) New RsdItem() With {
    .NOD = row.Field(Of String)("NOD"),
    .ITM = row.Field(Of String)("ITM"),
    .CIA = row.Field(Of Double)("CIA"),
    .DPR = row.Field(Of Double)("DPR"),
    .QTY = row.Field(Of Integer)("QTY"),
    .Total = row.Field(Of Double)("Total")
}).ToList()

grid.DataSource = itemList

这种方式代码量少,可读性强,性能也不错,适合单表场景。

2. 反射通用转换(适合多表复用)

如果有多个DataTable要转List,不想每个都写转换代码,可以整个通用方法,用反射自动映射字段:

Public Shared Function DataTableToList(Of T As New)(dt As DataTable) As List(Of T)
    Dim resultList As New List(Of T)()
    Dim entityProps = GetType(T).GetProperties()

    For Each row As DataRow In dt.Rows
        Dim entity As New T()
        For Each prop In entityProps
            If dt.Columns.Contains(prop.Name) AndAlso Not row.IsNull(prop.Name) Then
                prop.SetValue(entity, Convert.ChangeType(row(prop.Name), prop.PropertyType))
            End If
        Next
        resultList.Add(entity)
    Next
    Return resultList
End Function

用的时候就一句代码:

Dim itemList = DataTableToList(Of RsdItem)(dt)
grid.DataSource = itemList

注意:这个方法通用,但性能比直接LINQ略低,适合多表重复使用的场景。

二、优化你现有代码的几个细节

  1. 删掉da.Dispose():你已经用Using包裹了OleDbDataAdapter,Using会自动释放资源,手动Dispose多余。
  2. 去掉Me.grid.Refresh():当你设置DataSource时,DataGridView会自动刷新,不需要手动调用。
  3. 把Total计算移到SQL里:数据库计算比客户端快,直接在查询里生成Total列,省去代码里加DataColumn的步骤:
    SELECT NOD,ITM,CIA,DPR,QTY, [CIA]*[QTY]*(1-[DPR]/100) AS Total 
    FROM RSD 
    WHERE QTY > 0 AND PNM=@PNM
    

三、最优方案总结

  • 不需要实体类的话,直接绑定DataTable就是最优解,性能最好,代码最少。
  • 需要实体类做业务处理的话,LINQ转换是简便高效的首选。
  • 多表复用场景用反射通用转换,用少量性能损耗换代码复用性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:10:24