随笔 - 81  文章 - 73  评论 - 947  110

     你是否经常使用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控件:

<%@ Register Assembly="GroupingView" Namespace="UNLV.IAP.WebControls" TagPrefix="cc1" %>
       3.进行布局。你可以进行任意的布局,比如你可以让汇总的结果显示在左边、右边,可以在行与行之间加入分隔符,可以添加其它标记等等。
       但是,首先要遵守一定的布局结构。基本结构如下:
<cc1:GroupingView ID="gvTest" runat="server" AutobindDataSourceChildren="true"   GroupingDataField = "分组排序的字段">
    
<GroupTemplate>
       
<!--这里你可以显示分组的数据,这里的代码每个分组只执行一次-->
       
<asp:PlaceHolder ID="itemPlaceholder" runat="server" /> <!--这个控件用来显示分组内详细的item,显示样式由ItemTemplate决定-->
       
<!--这里你可以显示分组的数据,这里的代码每个分组只执行一次-->
    
</GroupTemplate>
    
<ItemTemplate>
    
<!--这里显示每个分组内的详细数据记录,执行次数等于该分组内的记录数-->
    
</ItemTemplate>
</cc1:GroupingView>
  4.与数据源进行绑定,我这里是通过在Page_Load中进行绑定。
Code

     
  接下来,我来举几个实例。
  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

Code


      其中的 <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,因此就不再演示了,我把后台的那个事件写一下,让大家参考一下。

Code


  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就可以搞定了。下面来看下布局代码。

Code

  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。 
posted on 2009-03-03 14:56 stg609 阅读(...) 评论(...) 编辑 收藏
分享按钮