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) 我尝试的一种方法是使用 .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 的第二种方法,但它看起来不可能,因为使用 IEnumerable(Of T) 进行 Grid Get 初始化并且所有对网格的调用都使用 IEnumerable(Of T)。所以归结为将 DataTable 转换为 IEnumerable(Of T) 并且我的 DataTable 是动态的我在设计时不知道它们的结构所以我不能编写任何特定的类来创建对象并将 DataTable 转换为 IEnumerable(Of T) .

有没有人对此有更好的出路。

谢谢

4

3 回答 3

2

这个问题很老了,但也许这可以帮助别人。我只需要用动态 DataTable 填充网格,并且在视图中这样做:

索引.cshtml

@using System.Data
@using MvcContrib.UI.Grid
@model SomeDataTable

@Html.Grid(Model.Rows.Cast<DataRow>()).Columns(columns =>{
  foreach (var dataColumn in Model.Columns.Cast<DataColumn>()){
    var column = dataColumn;
    columns.For(x => x[column]).Named(column.Caption);
  }
})
于 2013-10-31T14:00:25.523 回答
0

可以通过创建自定义 GridModel。在这里,我将我的网格基于一个填充了 IDictionaries 的 IList,但这对于从 DataTable 获取的数据也应该是可能的。诀窍是将数据结构交给自定义GridModel的构造函数,让自定义GridModel根据数据结构生成列。它有点难看,但效果很好。(在 VB.NET 中使用有趣的 lambda 表达式更难看)

控制器动作代码:

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

自定义网格模型:

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,则可以使用 AsEnumerable (来自DataTableExtensions。它看起来像这样:

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