Asp.Net GridView:好还是坏/用于绑定的数据类型是什么?

时间:2010-08-25 15:51:50

标签: gridview listview objectdatasource datalist webforms

所以,这个问题可能有点模糊,但我不断讨论它:

在设计Asp.Net页面时,很多时候您可能只想在页面上抛出一个快速而脏的GridView。当你走这条路线时,你有各种数据源选项(我通常使用绑定到业务对象的ObjectDataSource),你也可以手动绑定。

我已经看到很多变体,数据类型可以自动提供网格中的排序功能。我已经看到人们将他们的自定义POCO集合转换为业务对象中的DataTables,以便GridViews可以更轻松地支持这些类型的行为。

通过自己处理所有可用事件(OnSorting,OnUpdating等),您可以从GridView中获得很多不同的行为,并且从长远来看它最终可以高度自定义。即使是这种情况,您也可能遇到偷偷摸摸的其他小问题,例如无法使用“Enter”键自动执行给定行的更新操作。这是因为页面上的默认按钮可能在GridView之外,而ASP.Net只允许您为给定面板指定默认按钮,并且不会对GridView模板内的按钮表示此行为。这只是一个例子,请注意。当然还有一个问题是页面是否应该在每次过滤操作时返回数据源,或者是否应该在页面上的ViewState中缓存整个数据源以允许过滤/排序而不需要访问数据库...

所以这是最终的问题:在您想要基本CRUD操作的页面上使用GridView是否合理,即使它可能意味着将您的自定义集合转换为某种DataTable?是否应该完全放弃GridViews以支持其他类似DataList,ListView或Repeater的东西?后一种选择当然可能更灵活,但这是否意味着处理默认行选择,编辑,排序等等。应该为每种情况重建GridView的功能?

对此主题的任何合理的想法都赞赏!

2 个答案:

答案 0 :(得分:1)

我刚刚意识到这个问题仍然悬在这里,所以这是我对这个主题的结论:

我仍然认为在ASP.Net页面中嵌入标准GridView控件很有用。我仍然认为处理页面代码隐藏中的每个排序事件是不合理的,因为它会导致真正的维护噩梦,并且会使您的数据交互和业务逻辑代码过于接近MVC术语中的“视图”。

我不知道的是GridViews与各种DataSource控件的紧密集成。我知道在适当的情况下,当连接到SqlDataSource时,GridView会在应用自己的排序和分页技术时直接对数据库执行各种CRUD操作,但这并不能很好地转换为使用带有业务对象的ObjectDataSource - 或者我想。

原来,ObjectDataSource控件有三个关键属性,允许它使用排序和分页参数动态地为业务对象提供方法。

这些属性包括:SelectCountMethod,SortParameterName,StartRowIndexParameterName和MaximumRowsParameterName。这些属性与所需的EnablePaging标志一起更改“Select”方法的预期签名,并使用您的SelectCount方法自动启动以获取返回的总记录数,使用GridView的页面大小和当前状态来确定从哪里开始您的结果集以及在该起点之外选择的项目数,并开始提交SQL样式的排序表达式以及对Select方法的所有调用。

总而言之,这是向前迈出的一大步,但如果您使用POCO类的自定义集合,或者对LinqToSql或EF对象上下文执行查询,您仍然必须将StartRowIndex和MaximumRow参数转换为某种形式的一个Skip()。Take()组合(非常简单明了)并将Sort表达式转换为针对对象上下文或内存集合的某种类型的查询。

我不会深入讨论这里所有冗长的细节,但基本上解决方案是使用dynamic-Linq功能和反射来定义针对内存中集合的查询表达式,只需要使用Sorting字符串。< / p>

排序字符串将包含典型“FieldName DESC”格式的字段名称和排序方向(仅在降序时)。通过解析此字符串,您可以使用特定类型的反射来使用Sort字符串中的匹配属性名称创建表达式。

这里的主要好处是只需对select方法进行一些调整,并使用自定义Linq扩展来处理将排序字符串转换为lambda表达式,您就可以开始将GridView连接到业务的常规业务构建排序和分页功能的逻辑。

因为在原始问题中提到过,我会注意到这个解决方案几乎会在每个页面加载时对数据库造成影响,但最终返回的数据量应该更小,更有针对性。

答案 1 :(得分:1)

多年来第一次不得不再次使用gridviews,我记得为什么我没有使用它们这么久。 Gridview非常适合基本级别的设计,但不幸的是,大多数时候最终用户需要更多功能,而这正是他们开始不足的地方。虽然您可以自定义和扩展网格视图,但正如您所指出的,这会打开一整套不同的蠕虫。所以对我来说,我尝试坚持使用网格视图作为报告生成的工具。除此之外的一切,我似乎花了很多时间定制和调整它以获得接近我需要的东西,这是不值得的努力。