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中进行绑定。
ContractedBlock.gif ExpandedBlockStart.gif Code
protected void Page_Load(object sender, EventArgs e)
{
    SqlConnection conn 
= new SqlConnection("Data Source=127.0.0.1;Initial Catalog=test;Persist Security Info=True;User ID=sa;Password=sa;");
    conn.Open();
    dsSource 
= new DataSet();
    SqlDataAdapter sda 
= new SqlDataAdapter("select s.sno,s.sname,c.cname,sc.score from s,sc,c where sc.cno = c.cno and sc.sno = s.sno", conn);
    sda.Fill(dsSource);
    conn.Close();
    gvTest.DataSource 
= dsSource;
    gvTest.DataBind();
}

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

ContractedBlock.gif ExpandedBlockStart.gif Code
<cc1:GroupingView ID="gvTest" runat="server" AutobindDataSourceChildren="true"  GroupingDataField="sno" >
    
<GroupTemplate>
        
<table class="view">
                
<tr>
                    
<td>
                        sno
</td>
                    
<td>
                        sname
</td>
                    
<td>
                        cname
</td>
                    
<td>
                        score
</td>
                
</tr>
            
<asp:PlaceHolder ID="itemPlaceholder" runat="server" />
        
</table>
        
<table>
            
<tr>
                
<td>
                    总分:
                    
<cc1:Aggregation ID="Aggregation1" runat="server" Function="Sum" DataField="score" />
                
</td>
            
</tr>
        
</table>
    
</GroupTemplate>
    
<ItemTemplate>
        
<tr>
            
<td>
                
<%Eval("sno"%>
            
</td>
            
<td>
                
<%Eval("sname"%>
            
</td>
            
<td>
                
<%Eval("cname"%>
            
</td>
            
<td>
                
<%Eval("score"%>
            
</td>
        
</tr>
    
</ItemTemplate>
</cc1:GroupingView>


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

ContractedBlock.gif ExpandedBlockStart.gif Code
protected void gvTest_GroupCreated(object o, UNLV.IAP.WebControls.GroupingViewEventArgs e)
{
    PlaceHolder phHeadingRow 
= e.Item.FindControl("phHeadingRow"as PlaceHolder;//根据布局时的容器ID查找到Placeholder容器
    if (phHeadingRow != null)
    {
        phHeadingRow.Visible 
= (e.GroupIndex == 0);//如果该组不是第0组,就隐藏。
    }
}


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

ContractedBlock.gif ExpandedBlockStart.gif Code
<cc1:GroupingView ID="gvTest" runat="server" AutobindDataSourceChildren="true" GroupingDataField="sno" OnGroupCreated="gvTest_GroupCreated">
    
<GroupTemplate>
        
<table class="view">
            
<asp:PlaceHolder ID="phHeadingRow" runat="server">
                
<tr>
                    
<td>
                        sno
</td>
                    
<td>
                        sname
</td>
                    
<td>
                        cname
</td>
                    
<td>
                        score
</td>
                
</tr>
            
</asp:PlaceHolder>
            
<tr>
                
<td rowspan="10">
                    
<%Eval("sno"%>
                
</td>
                
<td rowspan="10">
                    
<%Eval("sname"%>
                
</td>
                
<td>
                
</td>
                
<td>
                
</td>
            
</tr>
            
<asp:PlaceHolder ID="itemPlaceholder" runat="server" />
        
</table>
        
<asp:PlaceHolder ID="phAggregation" runat="server">
            
<table>
                
<tr>
                    
<td colspan="3">
                        总分:
                        
<cc1:Aggregation ID="Aggregation1" runat="server" Function="Sum" DataField="score" />
                    
</td>
                
</tr>
            
</table>
        
</asp:PlaceHolder>
    
</GroupTemplate>
    
<ItemTemplate>
        
<tr>
            
<td>
                
<%Eval("cname"%>
            
</td>
            
<td>
                
<%Eval("score"%>
            
</td>
        
</tr>
    
</ItemTemplate>
</cc1:GroupingView>

   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。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值