• GroupingView控件 使用经验


         你是否经常使用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。 
    作者:stg609

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    本人博客已经转移到Charley Blog

  • 相关阅读:
    SDL的视频子系统
    SDL事件处理
    视频子系统中构基本概念和常用数据结
    ASP.NET程序打包的时候如何把TreeView一起打包(转)
    Javascript实现在DataGrid或DataList等容器上的CheckBox全选和取消
    Javascript实现DataGrid或DataList等容器上面选择单选框RadioButton
    git push 报src refspec xxx does not match any的错误
    vue运行报错error:Cannot assign to read only property 'exports' of object '#<Object>'
    weex不支持类的动态追加
    函数的作用域链在定义时已经确定!!
  • 原文地址:https://www.cnblogs.com/stg609/p/1402160.html
Copyright © 2020-2023  润新知