2009-11-26 1 views
5

Я прочитал много сообщений на эту тему; среди них и совсем недавно .NET - Convert Generic Collection to Data Table. К сожалению, все безрезультатно.Как заполнить DataTable списком (Of t) или преобразовать List (Of t) в DataTable?

У меня есть общий сборник структур:

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 с этим списком структур, но не имеют ни малейшего представления о том, как идти об этом. Я использую vb.net в Visual Studio 2008.

Любые идеи будут высоко оценили

ответ

11

Код, который вы связаны предполагает, что члены объявлены как свойства. Вы не объявили свойства. Вы можете заставить его работать с отражением:

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, спасибо за такой быстрый ответ! Я добавил эту функцию в свой класс, а затем передал ей список структур (oTable = ConvertToDataTable (LOStates)), но ни одна строка не была восстановлена ​​- таблица count = 0 перед возвратом туда, откуда она была вызвана. Мне интересно, есть ли что-то еще, что мне не хватает или что-то неправильно ... – 8thWonder

+0

Отладить его. Сделайте для каждого цикла петли? Есть ли в таблице какие-либо столбцы? –

+0

В отладке я смог определить, что таблица count = 0. Для каждого цикла циклов действительно. Существует 3 coumns, но 0 строк непосредственно перед выполнением оператора таблицы return. – 8thWonder

1

У меня такая же проблема, чем @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