在我的项目中,我想使用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。我trid传递IEnumerable(Of SampleDynamicObject),但BuildColumns()方法无法找到动态添加到其上的礼节。
2)我认为修改AutoGenerateColumns()方法以使用DataTable的第二种方法,但它看起来不可能,因为Grid Get使用IEnumerable(Of T)初始化并且所有对网格的调用方法都使用IEnumerable(Of T) 。所以它归结为将DataTable转换为IEnumerable(Of T)而我的DataTable是动态的我不知道他们在设计时的结构所以我不能写任何特定的类来创建一个对象并将DataTable转换为IEnumerable(Of T)
有没有人有更好的出路。
由于
桑迪答案 0 :(得分:2)
问题很老但也许这可以帮助其他人。我只需要用动态DataTable填充网格,我在视图中这样做:
<强> Index.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);
}
})
答案 1 :(得分:0)
如果您使用的是.NET 3.5,则可以使用AsEnumerable(来自DataTableExtensions。它看起来像这样:
IEnumerable<DataRow> data = datatable.AsEnumerable();
答案 2 :(得分: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
自定义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")))