2009-11-26 23 views
5

He leído muchas publicaciones sobre este tema; entre ellos y más recientemente .NET - Convert Generic Collection to Data Table. Lamentablemente, todo fue en vano.Cómo llenar una tabla de datos con una lista (de t) o convertir una lista (de t) en una tabla de datos?

Tengo una colección genérica de estructuras:

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

Dim LOStates As New List(Of MyStruct) 

Es necesario llenar un DataTable con esta lista de estructuras, pero no tienen idea de cómo hacer para hacer esto. Estoy utilizando vb.net en Visual Studio 2008.

Cualquier ideas serán muy apreciados

Respuesta

11

El código se enlazó asume los miembros se declaran como propiedades. No declaraste propiedades. Puede hacer que funcione con la reflexión:

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, gracias por una respuesta tan rápida! Agregué esta función a mi clase, y luego le pasé la lista de estructuras (oTable = ConvertToDataTable (LOStates)) pero no se reesistió ninguna fila - el recuento de la tabla = 0 antes de volver a donde se llamó desde. Me pregunto si hay algo más que me falta o que hago incorrectamente ... – 8thWonder

+0

Depurarlo. Haga lo de cada ciclo de bucles? ¿La tabla tiene alguna columna? –

+0

Fue en la depuración que pude determinar que el recuento de la tabla = 0. De hecho, para cada bucle de bucles. Hay 3 coumns pero 0 filas justo antes de que se ejecute la declaración de la tabla de retorno. – 8thWonder

1

Tengo mismo problema que @SamSelikoff, se trasladó a 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 
Cuestiones relacionadas