通过在 ASP.net MVC 2 应用程序中传递数据表,使用 mvccontrib 自动生成网格
在我的项目中,我想使用 mvccontrib (http://mvccontrib.codeplex.com) 自动生成网格通过将数据表传递到网格。目前 Grid 不支持此功能。
网格采用 IEnumerable(Of T) 并自动生成列。他们有什么办法可以通过传递 DataTable 来实现这一点吗?或者我如何将 DataTable 转换为 IEnumerable(Of T)。我的数据表是完全动态的,我在设计时不知道列数或列名称。 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 一起使用的第二种方法,但看起来不可能,因为 Grid Get 使用 IEnumerable(Of T) 进行初始化,并且对网格方法的所有调用都使用 IEnumerable(Of T)。所以归结为将 DataTable 转换为 IEnumerable(Of T) 并且我的 DataTable 是动态的我在设计时不知道它们的结构所以我无法编写任何特定的类来创建对象并将 DataTable 转换为 IEnumerable(Of T) 。
大家有没有更好的办法解决这个问题。
谢谢桑迪
In My project i want to use the mvccontrib (http://mvccontrib.codeplex.com) to auto generate grid by passing the DataTable to the Grid. Currently Grid does not support this.
Grid takes IEnumerable(Of T) and auto generate columns. Is their any way i can achieve this by passing DataTable. Or How do i convert the DataTable to IEnumerable(Of T). My DataTable is completely Dynamic i don't know number of columns or names of the columns at design time. DataTable completely dynamic number of columns are not fixed it just any DataTable.
How can i achieve this?
In Short i want to convert Dynamic DataTable to IEnumerable(Of T). Or Is their any better way.
I tried following way
1) One way i tried is using .net 4.0 Dynamic, DynamicObject and ExpandoObject
I created a dynamic class as shown here http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetindex.aspx. I trid passing IEnumerable(Of SampleDynamicObject) but BuildColumns() method is not able to find out the proprieties dynamically added on to it.
2) I think Second way to modify the AutoGenerateColumns() method to work with DataTable, But it looks impossible as Grid Get initialize using IEnumerable(Of T) and all the call on grid for method is using IEnumerable(Of T). So it's come down to converting DataTable to IEnumerable(Of T) and my DataTable are dynamic i don't know their structure at design time So i can't write any specific class to create a object and convert DataTable to IEnumerable(Of T).
Does any one have any better way out on this.
Thanks
Sandy
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这个问题很老了,但也许这可以帮助其他人。我只需要用动态 DataTable 填充网格,然后在视图中这样做:
Index.cshtml
The question is quite old but maybe this could help someone else. I just needed to fill grid with dynamic DataTable and I do it like this in view:
Index.cshtml
如果您使用的是 .NET 3.5,则可以使用 AsEnumerable(来自 DataTableExtensions。它看起来像这样:
If you're using .NET 3.5, you can use AsEnumerable (from DataTableExtensions. It would look something like this:
通过创建自定义 GridModel 可以实现这一点。
在这里,我的网格基于填充了 IDictionaries 的 IList,但这对于从 DataTable 获取的数据也应该是可能的。
诀窍是将数据结构交给自定义 GridModel 的构造函数,并让自定义 GridModel 根据数据结构生成列。
它有点难看,但效果很好。
(在带有有趣的 lambda 表达式的 VB.NET 中甚至更丑陋)
控制器操作代码:
自定义 GridModel:
视图中的语法:
It is possible by creating a custom GridModel.
Here I based my grid on an IList filled with IDictionaries, but this should also be possible with data taken from a DataTable.
The trick is to give the data structure to the constructor of the custom GridModel and let the custom GridModel generate columns based on the data structure.
It is a bit ugly, but it works good.
(and it is even uglier in VB.NET with the funny lambda expressions)
The controller action code:
The custom GridModel:
The syntax in the view: