2009-11-26 6 views
5

Ich habe viele Beiträge zu diesem Thema gelesen; unter ihnen und zuletzt .NET - Convert Generic Collection to Data Table. Leider alles vergebens.Wie füllt man eine DataTable mit einer Liste (Of t) oder konvertiert man eine List (Of t) in eine DataTable?

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 brauche eine Datentabelle mit dieser Liste von Strukturen zu füllen, habe aber keine Ahnung, wie dies zu tun gehen. Ich verwende vb.net in Visual Studio 2008.

Keine Erkenntnisse werden stark

Antwort

11

Der Code, den Sie die Mitglieder als Eigenschaften deklariert sind, wird davon ausgegangen verknüpft geschätzt. Sie haben keine Eigenschaften deklariert. Sie können es mit Reflexion funktioniert:

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 
+0

nobugz, danke für eine solche schnelle Antwort! Ich fügte diese Funktion meiner Klasse hinzu und übergab ihr dann die Liste der Strukturen (oTable = ConvertToDataTable (LOStates)), aber es wurden keine Zeilen neu generiert - die Anzahl der Tabellen war 0, bevor sie an die Stelle zurückgegeben wurde, von der sie aufgerufen wurde. Ich frage mich, ob es etwas anderes gibt, das ich vermisse oder falsch mache ... – 8thWonder

+0

Debuggen. Tun Sie das für jede Schleife? Hat die Tabelle Spalten? –

+0

Es war im Debugging, dass ich feststellen konnte, dass die Anzahl der Tabellen = 0. Die für jede Schleife tatsächlich. Es gibt 3 Coumns, aber 0 Zeilen, bevor die Anweisung für die Rückgabetabelle ausgeführt wird. – 8thWonder

1

ich gleiche Problem als @SamSelikoff, zu GetProperties bewegt:

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