2010-08-25 71 views
0

所以,这个问题可能有点含糊,但我经常讨论它:Asp.Net GridView:好还是坏/用于绑定的数据类型?

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

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

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

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

关于这个问题的任何合理的想法赞赏!

回答

1

我才意识到这个问题,仍然挂在这里所以这里是我对这个话题的结论:

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

我不知道GridViews与各种DataSource控件的集成程度如何。我知道在给定正确的情况下,连接到SqlDataSource的GridView会在应用自己的排序和分页技术时直接对数据库执行各种CRUD操作,但这并不能很好地将ObjectDataSource与业务对象一起使用 - 或者如此我想。

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

这些属性是:SelectCountMethod,SortParameterName,StartRowIndexParameterName和MaximumRowsParameterName。与需要EnablePaging标志一起这些属性更改“中选择”方法的预期的签名,并开始自动使用SelectCount方法得到的总记录可能的数字返回,使用GridView的页面大小和当前状态,以确定在哪里开始结果集以及要在该起点之外选择的项目数,并开始提交SQL样式的排序表达式以及对Select方法的所有调用。总而言之,这是一大进步,但如果您使用POCO类的自定义集合,或者针对LinqToSql或EF对象上下文执行查询,则仍然必须将StartRowIndex和MaximumRow参数转换为某种形式一个跳跃的()。以()组合(这是非常简单和明显)和排序表达式转换为对你的对象上下文或内存中的集合某些类型的查询。

我不会在这里介绍所有冗长的细节,但基本上解决方案是使用动态Linq功能和反射来定义一个查询表达式,以便只使用排序字符串继续处理内存中的集合。

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

这里的主要好处是,只有少数几个调整到选择方法和使用自定义的LINQ扩展处理一种字符串转换成一个lambda表达式,你可以去GridView的连接最多的您的常规业务具有构建排序功能的业务逻辑以及分页功能。

因为它是在原来的问题提到的,我会注意到,该解决方案将导致命中在数据库上几乎每一个页面加载,但最终返回的数据量要小得多,更具有针对性。

1

刚走不得不首次在年GridView的再次使用,我想起为什么我没有使用过他们这么久。 GridView的是伟大的他们都在一个基本水平设计的,但不幸的是大部分时间的最终用户会希望有更多的功能,而这正是他们开始功亏一篑。虽然您可以自定义和扩展网格视图,但是正如您所指出的那样,这会打开一整串不同的蠕虫。所以对我来说,我尝试坚持使用网格视图作为报表生成的工具。除此之外的任何事情,我似乎花费很多时间来定制和调整它,以获得接近我需要的东西,这是不值得的努力。