ReportViewer单据票据打印,自动分页,每页显示固定行数,每页都显示表头

3 篇文章 0 订阅
1 篇文章 2 订阅

报表工具用来用去,其实还是微软自带的ReportViewer比较轻量好用,一般需求完全够用。只是由于不常用,总会有解决一个问题过段时间又忘了怎么解决的问题。索性整理一下,当作笔记了。

在票据打印的时候,为了美观,要求每页都行数固定,即便数据不够一整页,也要用空行填充。这个需求,实现的基本原理就是:分组,一个分组刚好一页,所以他就每页行数固定了,至于不够整页用空行填充的话,可以在数据集中添加空白数据,比如8行一页,不足8行用空数据填充到8行,总之填充到:数据数量%每页行数=0即可。下面来详细说明实现方法:

首先说明一点,通过行高及页眉页脚的高度去控制分页是不可靠的,页数多了之后误差越来越大,最后就出现断行、位置变化等问题。

每页固定行数:

首先设置好行高,确保每页显示N行时页面布局刚好。

int PageRows = 8;//每页显示的行数

if (shdMx.Length % PageRows != 0)
 {
   //不足8行填充空行
   List<SongHdMx> mxList = new List<SongHdMx>();
   mxList.AddRange(shdMx);

   //单据数据是根据Id排序的,为了排序不让空白数据跑到真实数据的前面,找出真实数据的Id最大号
   long a = mxList.Max(s => s.Id);
   while (mxList.Count % PageRows != 0)
    {
      a++;//将真实数据的最大Id号加1,作为填充的空数据Id号,当然了,界面上是不显示这个Id的,只排序
       mxList.Add(new SongHdMx(a));
    }
    shdMx = mxList.ToArray();
  }

……

reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("ShdMx", shdMx));

用于控制每页显示固定行数的分组表达式为:=Int((RowNumber(nothing)-1)/Parameters!PageRows.Value)

其中的PageRows为传入的报表参数,也可以直接写数字。

接下来再设置一下分页符中的选项,只勾选“在组的各实例之间”即可。

到这一步,在没有填充空数据用于占行的情况下,每页显示固定行数已经可以了,但是如果有空行数据填充的,还要做一件事,不然所有填充的空数据行是不会显示的,这就是为什么前面填充空数据的时候,我们要赋一个Id进去,就是为了根据这个Id分组,排序,如果全是空,填充再多的数据也会被分组功能合并掉,以至于会不显示。

那就是在主行数分组下面添加子分组,主分组控制每页显示的行数,子分组用于保证填充的空白数据行不被分组合并掉。

至此,每页显示固定行数,且能添加空白数据的问题已经彻底解决。

 

接下来,我们看看,每页都显示表头的问题。

第①步:点击列组右边的小三角,选择“高级模式”,

第②步:选中行组中的第一行(静态),这个其实就是表头的第一格,

第③步:在属性栏设置:RepeatOnNewPage=true,KeepWithGroup=After(因为第一页本来就有表头,第二页开始才没有,所以设定After)

看一下效果:

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值