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
相关产品推荐
相关产品推荐

