2014-04-09 32 views
2

基于其他Stackoverflow的答案,我已经为测试编写了一个简单的列表和数据表转换,但是在调试时,Dataset Visualizer不会在数据表中显示任何内容。我错过了什么吗?下面的代码:列表(T)到Datatable?

Public Class ObjectToTable 
    Dim s As List(Of Events) 
    Public Sub New(ByVal s As List(Of Events)) 
     Me.s = s 
     s.Add(New Events("A")) 
     s.Add(New Events("B")) 
     s.Add(New Events("C")) 
     s.Add(New Events("D")) 
    End Sub 
    Public Function GetTable() As DataTable 
     Dim props As PropertyDescriptorCollection = TypeDescriptor.GetProperties(GetType(Events)) 
     For i As Integer = 0 To props.Count - 1 
      Dim prop As PropertyDescriptor = props(i) 
      myTable.Columns.Add(prop.Name, prop.PropertyType) 
     Next 
     Dim values As Object() = New Object(props.Count - 1) {} 
     For Each Events As Events In s 
      For i As Integer = 0 To values.Length - 1 
       values(i) = props(i).GetValue(Events) 
      Next 
      myTable.Rows.Add(values) 
     Next 
     Return myTable 
    End Function 
End Class 

谢谢...

+1

当/其中'myTable'实例化? –

回答

0

如果你的问题是如何A list(of T) to a Datatable?转换,然后将下面的代码可能是一个更好的办法。

Imports System.Runtime.CompilerServices 
Imports System.Reflection 

<Extension()> _ 
Public Module Extensions 

    <Extension()> _ 
    Public Function ToDataTable(Of T As Class)(data As List(Of T)) As DataTable 
     Dim result As New DataTable() 
     Dim type As Type = GetType(T) 
     Dim list = (From p As PropertyInfo In type.GetProperties() Where (p.CanRead AndAlso (p.GetIndexParameters().Length = 0)) Select New With {.[Property] = p, .Column = New DataColumn(p.Name, p.PropertyType)}) 
     result.Columns.AddRange((From obj In list Select obj.Column).ToArray()) 
     If (Not data Is Nothing) Then 
      result.BeginLoadData() 
      Array.ForEach(Of T)(data.ToArray(), Function(item As T) result.Rows.Add((From obj In list Select obj.[Property].GetValue(item, Nothing)).ToArray())) 
      result.EndLoadData() 
     End If 
     result.AcceptChanges() 
     list = Nothing 
     type = Nothing 
     Return result 
    End Function 

End Module 

用法

Imports {YOUR.NAMESPACE}.Extensions 

Dim list As New List(Of Events)({New Events("A"), New Events("B"), New Events("C"), New Events("D")}) 
Dim table As DataTable = list.ToDataTable() 
+0

工作很好,谢谢。 –

+0

接下来,是否可以使用相同的“Public Function ToDataTable”为列表(列表)的每个元素创建一个数据表? –

+0

是的,但它只会根据'List(T)'属性'Capacity'和'Count'创建一个数据表。这里是一个使用字符串的例子:'Dim table As DataTable = New List(Of List(Of String))({New List(Of String)({“a”,“b”,“c”}),New List(Of字符串)({“d”,“e”,“f”})})。ToDataTable()' –