你是否经常使用GridView进行数据输出?你是否曾经试图使用VS.Net自带的GridView控件来实现分组统计等功能?是不是觉得实现起来很麻烦或者压根实现不了?
如果你不曾遇到过类似问题,那么这篇文章对你将毫无帮助。
这个控件就可以为帮我们很好的解决分组统计等问题,功能很强大。(PS:我不是做广告哦,只是有感而发~)当然,除了这个控件外,还有一个GridViewHelper控件,同样可以实现强大的分组功能,但是从我使用的体验来说,个人更倾向GroupingView。可能是我对GridViewHelper使用不多的原因,我认为使用GridViewHelper对页面的布局基本上不需要做任何设置。而分组、统计等等功能,都是利用后台代码进行设置,对于简单的分组几乎只要写一个语句就可以实现。可以说是相当方便。但是,我在使用过程中遇到几个问题:1、如果不是利用ASP.NET 提供的数据源控件对GridView进行数据源的绑定,而是通过在page_load事件中执行数据源绑定,则按照示例代码进行编辑就无法显示预期效果。2、由于它的方便,导致使用不灵活,因为有些时候我们可能希望布局上更加随意,但由于该控件不需要对布局进行设置,也使得我们如果想调整布局将会很麻烦。(以上2点,是我初浅的使用后的感觉,可能深入使用下去,还会有更多问题。当然也可能是因为我不会用造成的。)
说完了GridViewHelper,接下来就到了这篇文章的主角上场了,我在使用GroupingView中并没有遇到上面的问题。
GroupingView 控件的详细使用介绍及下载,请点击。该控件是由Mike Ellison开发的,我试用了一下,感觉不错。
使用经验:
1.下载该控件,可以找到GroupingView.dll文件,将该dll文件添加到你的项目Bin文件夹中。
2.在要使用的页面注册GroupingView控件:
但是,首先要遵守一定的布局结构。基本结构如下:
<GroupTemplate>
<!--这里你可以显示分组的数据,这里的代码每个分组只执行一次-->
<asp:PlaceHolder ID="itemPlaceholder" runat="server" /> <!--这个控件用来显示分组内详细的item,显示样式由ItemTemplate决定-->
<!--这里你可以显示分组的数据,这里的代码每个分组只执行一次-->
</GroupTemplate>
<ItemTemplate>
<!--这里显示每个分组内的详细数据记录,执行次数等于该分组内的记录数-->
</ItemTemplate>
</cc1:GroupingView>
接下来,我来举几个实例。
e.g. 1 效果图如下:
sno | sname | cname | score
1 s1 c1 80
1 s1 c2 90
1 s1 c3 70
总分:240
sno | sname | cname | score
2 s2 c1 80
2 s2 c2 80
2 s2 c3 80
总分:240
其中的 <cc1:Aggregation ID="Aggregation1" runat="server" Function="Sum" DataField="score" />是该控件提供的一种集合运算控件,你可以通过设置Function来得到对某一字段进行统计运算如Sum、AVG等。在ItemTemplate中,我们可以看到很熟悉的Eval,这个就是用来与数据进行绑定,而ItemTemplate中的代码和数据则会最终被填充到ID为itemPlaceholder的placeholder容器中。这样最终就可以显示成如效果图所示的样子了。
e.g. 2 效果图如下:
sno | sname | cname | score
1 s1 c1 80
1 s1 c2 90
1 s1 c3 70
总分:240
2 s2 c1 80
2 s2 c2 80
2 s2 c3 80
总分:240
细心的朋友,应该已经看出1和2这两个例子的区别了吧?是的,在示例2中,第二个分组的列头不再重复显示了。这个是怎么实现的呢?要实现这个效果就需要添加一个"OnGroupCreated"事件,这个事件在每一个分组被创建的时候触发,我们就在这个事件中判断是否需要列头,如果不需要就不显示。
根据Mike Ellison提供的做法是添加一个placeholder容器。然后将列头的布局代码移动到该容器中,然后在OnGroupCreated事件中判断此组是否为第一组,如果不是就设置该容器的Visible属性为false。
前台的布局只是增加了一个placeholder,因此就不再演示了,我把后台的那个事件写一下,让大家参考一下。
e.g. 3 效果图如下:
sno | sname | cname | score
c1 80
1 s1 c2 90
c3 70
总分:240
c1 80
2 s2 c2 80
c3 80
总分:240
这个例子就是使分组字段在每组中只出现一次,而不再重复出现。
要实现这个效果,就需要我们修改布局代码,这个例子可以很好的说明该控件的灵活性,因为布局要怎么样完全由我们自己说了算。如果想让分组字段在一个组内只出现一次,我们就应该把数据直接写到GroupTemplate中,因为这其中的代码每一组只执行一次。如果想让他居中显示,那就是合并单元格的事了。而合并单元格对于table标记是不是很容易办到呢?只要设置rowspan或colspan就可以搞定了。下面来看下布局代码。
e.g. 4 效果图如下:
sno=1
sno | sname | cname | score
c1 80
1 s1 c2 90
c3 70
总分:240
sno=2
c1 80
2 s2 c2 80
c3 80
总分:240
大家是不是看见在每一组的列头前又多了一条数据(用来显示每个组的字段)。如果你看了前面几个例子,相信这个应该马上能想出来怎么实现吧?方式很多,比如用表格、DIV等+Eval。具体实现方式就不写了,就当是测验下自己吧。如果实在不会,就给我发EMail吧~
看了上面的这些例子,你是不是觉得使用这个控件似乎与自带的GridView控件一点没联系了,其实不然。我们上面呈现数据的方式,都是使用table,你还可以直接把一个GridView放在GroupTemplate中,这样会更加方便,不过肯定不如table灵活多变(个人认为)。关于如何使用GridView来呈现数据,我就不举例了。大家只要去我提供的网址下载该控件,里面包含很多Sample,Sample1中就是用的GridView。