2009-11-26 7 views
5

J'ai lu de nombreux articles sur ce sujet; parmi eux et plus récemment .NET - Convert Generic Collection to Data Table. Malheureusement, tout cela en vain.Comment remplir un DataTable avec une liste (Of t) ou convertir une liste (Of t) en DataTable?

J'ai une collection générique de structures:

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

Dim LOStates As New List(Of MyStruct) 

je dois remplir un DataTable avec cette liste de structures, mais ont aucune idée de comment s'y prendre. J'utilise vb.net dans Visual Studio 2008.

Les idées seront grandement appréciés

Répondre

11

Le code suppose que les membres lié sont déclarés en tant que propriétés. Vous n'avez pas déclaré de propriétés. Vous pouvez le faire fonctionner avec la réflexion:

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, merci pour cette réponse rapide! J'ai ajouté cette fonction à ma classe, puis je lui ai passé la liste des structures (oTable = ConvertToDataTable (LOStates)) mais aucune ligne n'a été rétrogradée - la table count = 0 avant d'être renvoyée à l'endroit d'où elle a été appelée. Je me demande s'il y a quelque chose d'autre qui me manque ou qui ne fonctionne pas correctement ... – 8thWonder

+0

Déboguez-le. Faire la boucle pour chaque boucle? La table contient-elle des colonnes? –

+0

C'était dans le débogage que j'étais capable de déterminer que le nombre de table = 0. La boucle de chaque boucle en effet. Il y a 3 coumns mais 0 lignes juste avant l'exécution de l'instruction return table. – 8thWonder

1

J'ai même question que @SamSelikoff, déplacé à 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 
Questions connexes