分享

水晶报表(CrystalReports)-分组实现分页功能

 glxym 2014-12-29

水晶报表(CrystalReports)进阶篇-通过分组实现分页功能


 

实现的效果展示一下:

      主要就是给前面提到的简单应用(水晶报表(CrystalReports)的简单应用(ASP.NET) .)中的报表添加分页功能 并且保证

当数据记录不够一页时可以由空白行补全

      首先应该分析报表结构

      通过上图很容易看出,报表主要分为表头,明细,脚注。这个单据是固定纸张宽度高度的,我们的表头,明细很好处

理,但是脚注放哪一节里呢?(问题一)

      每六行数据规定了一页,如果一页中只有三行数据,为了保证脚注的位置不变打印出来的单据格式整齐,如何将其它

三行由空白行补全呢?(问题二)

      通过分析,我们可以想到利用分组得到想要实现的效果

      1.表头写到页眉节;明细写到详细资料节;脚注写到组尾;

      2.其它空白行由组来控制;

         (1)根据页的行数确定组尾数,这里每页显示六行,我们至少要有五行的空白行;

         (2)所以将组尾分成六份,前五项用来控制是否要补空白行,最后一行用来显示脚注;

注:上面这个格式设置由开发人员决定,不一定非要放到这些地方,目前为了实现这一个效果,我的实现是这样

       具体实现

       1.插入组:【字段资源管理器】→【插入组】

          (1)组很通俗易懂,把通过一或多个过虑条件的数据放在一起,这里当然也得选择一个字段作为分组的依据,数据源

这里用的是.net对象,是一个具体的实体类,在这个实体对象中,有这样一个属性专门为分组服务的标识器如:

  1. //分组标识器  
  2.  private int crorder;  
  3.  public int Crorder  
  4.  {  
  5.      get {return crorder; }  
  6.      set { crorder = value; }   
  7.  }  

          (2)绑定报表的数据源是一个List里面也许会有很多条记录,为了每页显示6条,简单的将可以设置标识器的值为每6条记录+1

这样默认值0,记录六条时改为1,在增加6条改为2.这样分组时会自动根据这个值把数据按每页6条记录分开如:

  1. //得到数据源List的方法中这样处理i记录总条数,6为每页显示记录数,corder临时标识,m.Crorder为实体对象的分组标识器  
  1. if (i % 6== 0) { corder++; m.Crorder = corder; }  
  2.  else{ m.Crorder = corder; }  
  1. //如果除6余0说明i为6的倍数,要分组,对分组标识器+1操作,如果余数不为0,证明这一页不鸣6条记录,分组标识不变  

           组专家如下

            2.组尾继续插入组,分为六(a,b,c,d,e,f)如下:


报表面板内右击【报表】→【节专家】进行相应配置

注:提到的有配置,没有提到的就按默认

组头

【在后面页新建页】后面的按钮点开写入:groupnumber mod 1 =0点击保存并关闭 】如下:

组尾a

【抑制显示】后面的按钮点开写入:

注:ImportStoragePrintModel.Number是实体对象中的一个属性,在这里就是通过Count(字段名)统计行数的作用,这个组尾a实现的功能是如果最后一行的行数除6余数在0到5之间时显示,否则不显示,【抑制显示】里false代表不抑制显示

if Count ({ImportStoragePrintModel.Number}) mod 6>0 and Count ({ImportStoragePrintModel.Number}) mod 6<=5 and onlastrecord then
    false
else
    true

点击保存并关闭 】如下:

下面只把组尾b,c,d,e代码贴出,图都如组尾a

组尾b

if Count ({ImportStoragePrintModel.Number}) mod 6>0 and Count ({ImportStoragePrintModel.Number}) mod 6<=4  and onlastrecord then
    false
else
    true

组尾c

if Count ({ImportStoragePrintModel.Number}) mod 6>0 and Count ({ImportStoragePrintModel.Number}) mod 6<=3  and onlastrecord then
    false
else
    true

组尾d

if Count ({ImportStoragePrintModel.Number}) mod 6>0 and Count ({ImportStoragePrintModel.Number}) mod 6<=2  and onlastrecord then
    false
else
    true

组尾e

if Count ({ImportStoragePrintModel.Number}) mod 6>0 and Count ({ImportStoragePrintModel.Number}) mod 6<=1 and onlastrecord then
    false
else
    true

 

数据源的绑定在简单应用(水晶报表(CrystalReports)的简单应用(ASP.NET) .)中提到这里不在讨论

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多