2009-11-26 11 views
5

私はこのトピックに関する多くの記事を読んでいます。それらの中で最も最近では.NET - Convert Generic Collection to Data Tableです。残念ながら、すべて役に立たない。DataTableをList(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を埋めるために必要があるが、これをやって行くにはどのようには考えています。私は2008年

任意の洞察力が大幅に

答えて

11

を理解されるであろう、あなたがリンクされたコードは、メンバーがプロパティとして宣言されている前提としてのVisual Studioでvb.netを使用しています。あなたはプロパティを宣言しませんでした。あなたはそれが反射して動作させることができます。

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))を渡しましたが、リターンされた行はありませんでした。私は行方不明または間違っている何かがあるかどうか疑問に思っています... – 8thWonder

+0

それをデバッグしてください。各ループループに対して行うか?テーブルには列がありますか? –

+0

デバッグ中で、テーブル数= 0であることがわかりました。実際には各ループのループがあります。 return table文が実行される直前に3つのクーミングがありますが、0の行があります。 – 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 
関連する問題