如何用 List(Of t) 填充 DataTable 或将 List(Of t) 转换为 DataTable?

Posted

技术标签:

【中文标题】如何用 List(Of t) 填充 DataTable 或将 List(Of t) 转换为 DataTable?【英文标题】:How to fill a DataTable with a List(Of t) or convert a List(Of t) to a DataTable? 【发布时间】:2009-11-26 21:04:46 【问题描述】:

我已经阅读了很多关于这个主题的帖子;其中包括最近的.NET - Convert Generic Collection to Data Table。不幸的是,一切都无济于事。

我有一个通用的结构集合:

Private Structure MyStruct
Dim sState as String
Dim lValue as Long
Dim iLayer as Integer
End Structure

Dim LOStates As New List(Of MyStruct)

我需要用这个结构列表填充 DataTable,但不知道如何去做。我在 Visual Studio 2008 中使用 vb.net。

任何见解将不胜感激

【问题讨论】:

【参考方案1】:

您链接的代码假定成员被声明为属性。你没有声明属性。你可以让它与反射一起工作:

Imports System.Reflection
...

      Public Shared Function ConvertToDataTable(Of T)(ByVal list As IList(Of T)) As DataTable
        Dim table As New DataTable()
        Dim fields() As FieldInfo = GetType(T).GetFields()
        For Each field As FieldInfo In fields
          table.Columns.Add(field.Name, field.FieldType)
        Next
        For Each item As T In list
          Dim row As DataRow = table.NewRow()
          For Each field As FieldInfo In fields
            row(field.Name) = field.GetValue(item)
          Next
          table.Rows.Add(row)
        Next
        Return table
      End Function

【讨论】:

nobugz,感谢您的及时回复!我将此函数添加到我的类中,然后将结构列表 (oTable = ConvertToDataTable(LOStates)) 传递给它,但没有重新运行任何行 - 在返回到调用它的位置之前表计数 = 0。我想知道是否还有其他我遗漏或做错的事情...... 调试它。 for each 循环是否循环?表格有列吗? 在调试中,我能够确定表计数 = 0。for each 循环确实循环。在执行返回表语句之前有 3 个列,但有 0 行。 我注意到,在我输入完最后一个回复后,我就包含了 add 语句。但是在将第一行添加到 DataTable 之后,它会引用“System.Reflection.TargetInvocationException”,然后继续向 DataTable 添加更多行。 对不起,让你这么痛心!非常感谢您的帮助和耐心:)【参考方案2】:

我有与@SamSelikoff 相同的问题,已移至 GetProperties:

Public Shared Function ConvertToDataTable(Of t)(
                                                  ByVal list As IList(Of t)
                                               ) As DataTable
    Dim table As New DataTable()
    If Not list.Any Then
        'don't know schema ....
        Return table
    End If
    Dim fields() = list.First.GetType.GetProperties
    For Each field In fields
        table.Columns.Add(field.Name, field.PropertyType)
    Next
    For Each item In list
        Dim row As DataRow = table.NewRow()
        For Each field In fields
            dim p = item.GetType.GetProperty(field.Name)
            row(field.Name) = p.GetValue(item, Nothing)
        Next
        table.Rows.Add(row)
    Next
    Return table
End Function

【讨论】:

【参考方案3】:

如果有人正在处理可空类型,请遵循@Hans Passant 函数:

For Each field As FieldInfo In fields
' Extra check for nullable
If field.FieldType.AssemblyQualifiedName.Contains("System.Nullable") Then
    ' Insert proper type
    If field.FieldType.AssemblyQualifiedName.Contains("System.DateTime") Then
       table.Columns.Add(field.Name, Type.GetType("System.DateTime"))
    End If
Else
    table.Columns.Add(field.Name, field.FieldType)
End If
Next

价值观:

For Each item As T In list
Dim row As DataRow = table.NewRow()
For Each field As FieldInfo In fields
    ' Check if value is null
    If field.GetValue(item) is nothing Then
        Continue For
    End If
    row(field.Name) = field.GetValue(item)
Next
table.Rows.Add(row)
Next

【讨论】:

以上是关于如何用 List(Of t) 填充 DataTable 或将 List(Of t) 转换为 DataTable?的主要内容,如果未能解决你的问题,请参考以下文章

如何用选择颜色填充画布?

如何用dict \ df在一列上用条件替换列列表

如何用另一个列表元素随机替换列表元素?

C#中如何用for循环遍历List<类>?

如何用java创建一个用于构建广播变量spark的类标记?

matlab怎么用函数填充三维曲线