8 Stimmen

Wie füllt man eine DataTable mit einer List(Of t) oder konvertiert eine List(Of t) in eine DataTable?

Ich habe viele Beiträge zu diesem Thema gelesen, unter anderem und vor allem .NET - Generische Sammlung in Datentabelle konvertieren . Leider alles ohne Erfolg.

Ich habe eine generische Sammlung von Strukturen:

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

Dim LOStates As New List(Of MyStruct)

Ich muss eine DataTable mit dieser Liste von Strukturen füllen, habe aber keine Ahnung, wie ich das anstellen soll. Ich verwende vb.net in Visual Studio 2008.

Wir sind für jeden Einblick dankbar.

20voto

Hans Passant Punkte 894572

Der von Ihnen verlinkte Code geht davon aus, dass die Mitglieder als Eigenschaften deklariert sind. Sie haben keine Eigenschaften deklariert. Sie können es mit Reflection funktionieren lassen:

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

8voto

dani herrera Punkte 43704

Ich habe das gleiche Problem wie @SamSelikoff, verschoben auf 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

0voto

xdjiijii Punkte 135

Folgende Funktion von @Hans Passant, falls jemand mit nullbaren Typen zu tun hat:

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

Werte:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X