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略低,适合多表重复使用的场景。
二、优化你现有代码的几个细节
- 删掉
da.Dispose():你已经用Using包裹了OleDbDataAdapter,Using会自动释放资源,手动Dispose多余。 - 去掉
Me.grid.Refresh():当你设置DataSource时,DataGridView会自动刷新,不需要手动调用。 - 把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
相关产品推荐
相关产品推荐

