0

私のプロジェクトでは、mvccontrib ( http://mvccontrib.codeplex.com ) を使用して、DataTable を Grid に渡してグリッドを自動生成したいと考えています。現在、Grid はこれをサポートしていません。

グリッドは IEnumerable(Of T) を受け取り、列を自動生成します。DataTableを渡すことでこれを達成できる方法はありますか。または、DataTable を IEnumerable(Of T) に変換するにはどうすればよいですか。私の DataTable は完全に動的です。設計時に列の数や列の名前がわかりません。DataTable 完全に動的な列数は固定されておらず、DataTable だけです。

どうすればこれを達成できますか?

つまり、Dynamic DataTable を IEnumerable(Of T) に変換したいと考えています。または、彼らのより良い方法です。

私は次の方法を試しました

1) 私が試した 1 つの方法は、.net 4.0 Dynamic、DynamicObject、および ExpandoObject を使用することです。ここに示すように動的クラスを作成しましたhttp://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetindex.aspx。IEnumerable(Of SampleDynamicObject) を渡そうとしましたが、BuildColumns() メソッドは動的に追加されたプロパティを見つけることができません。

2) AutoGenerateColumns() メソッドを DataTable で動作するように変更する 2 番目の方法だと思いますが、Grid Get は IEnumerable(Of T) を使用して初期化し、メソッドのグリッドでのすべての呼び出しは IEnumerable(Of T) を使用しているため、不可能に見えます。したがって、DataTable を IEnumerable(Of T) に変換することになり、私の DataTable は動的です。設計時にそれらの構造がわからないので、特定のクラスを記述してオブジェクトを作成し、DataTable を IEnumerable(Of T) に変換することはできません。 .

これについて何か良い方法はありますか?

ありがとう

砂の

4

3 に答える 3

0

カスタム GridModel を作成することで可能になります。ここでは、IDictionaries で満たされた IList に基づいてグリッドを作成しましたが、これは DataTable から取得したデータでも可能です。秘訣は、カスタム GridModel のコンストラクターにデータ構造を与え、カスタム GridModel がデータ構造に基づいて列を生成できるようにすることです。少し醜いですが、うまく機能します。(そして、面白いラムダ式を使用したVB.NETではさらに醜いです)

コントローラーのアクション コード:

Dim list As IList(Of IDictionary(Of String, String)) = New List(Of IDictionary(Of String, String))
Dim row1 As IDictionary(Of String, String) = New Dictionary(Of String, String)()
row1.Add("Column1", "ValueColumn1Row1")
row1.Add("Column2", "ValueColumn2Row1")
Dim row2 As IDictionary(Of String, String) = New Dictionary(Of String, String)()
row2.Add("Column1", "ValueColumn1Row2")
row2.Add("Column2", "ValueColumn2Row2")
list.Add(row1)
list.Add(row2)
ViewData("DynamicData") = list

カスタム GridModel:

Public Class DynamicGridModel
Inherits MvcContrib.UI.Grid.GridModel(Of IDictionary(Of String, String))

    Public Sub New(ByVal dataToRender As IList(Of IDictionary(Of String, String)))
        If dataToRender.Count > 0 Then
            For Each name As String In dataToRender(0).Keys
                Dim columnName As String = name
                Column.For(Function(rowData As IDictionary(Of String, String)) rowData(columnName)).Named(columnName)
            Next
        End If
    End Sub

End Class

ビューの構文:

Html.Grid(Of IDictionary(Of String, String))("DynamicData").WithModel(New DynamicGridModel(ViewData("DynamicData")))
于 2011-07-13T13:33:40.703 に答える
0

.NET 3.5 を使用している場合は、( DataTableExtensionsから) AsEnumerable を使用できます。次のようになります。

IEnumerable<DataRow> data = datatable.AsEnumerable();
于 2010-07-07T03:11:05.853 に答える