2009-11-26 14 views
5

Tôi đã đọc nhiều bài viết về chủ đề này; trong số đó và gần đây nhất là .NET - Convert Generic Collection to Data Table. Thật không may, tất cả đều không có kết quả.Làm thế nào để điền vào một DataTable với một danh sách (Of t) hoặc chuyển đổi một danh sách (Of t) thành một DataTable?

Tôi có một bộ sưu tập chung của cấu trúc:

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

Dim LOStates As New List(Of MyStruct) 

tôi cần phải điền vào một DataTable với danh sách các cấu trúc nhưng không có ý tưởng làm thế nào để đi về việc này. Tôi đang sử dụng vb.net trong Visual Studio 2008.

Bất kỳ hiểu biết sâu sắc sẽ được đánh giá rất

Trả lời

11

Mã bạn liên kết giả định các thành viên được khai báo là tài sản. Bạn đã không khai báo tài sản. Bạn có thể làm cho nó làm việc với Reflection:

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, cảm ơn bạn đã phản ứng nhanh chóng như vậy! Tôi đã thêm hàm này vào lớp của tôi, sau đó chuyển nó vào danh sách các cấu trúc (oTable = ConvertToDataTable (LOStates)) nhưng không có hàng nào được truy xuất - bảng đếm = 0 trước khi được trả về nơi nó được gọi. Tôi tự hỏi nếu có cái gì khác mà tôi đang thiếu hoặc làm không chính xác ... – 8thWonder

+0

Gỡ lỗi nó. Làm cho mỗi vòng lặp vòng? Bảng có bất kỳ cột nào không? –

+0

Nó đã được gỡ lỗi mà tôi đã có thể xác định rằng bảng đếm = 0. Các vòng lặp cho mỗi vòng thực sự. Có 3 coumns nhưng 0 hàng ngay trước khi câu lệnh return table được thực hiện. – 8thWonder

1

Tôi có cùng một vấn đề hơn @SamSelikoff, chuyển đến 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