摘要:
提供一种方案,使分页浏览的报表每页显示固定条数记录,最后一页记录条数不足的,用空行补齐。
示例:
记录共7条,每页显示5条记录:
下载代码(vs2008,需要安装AdventureWorks数据库)
下载代码(vs2008,不需要数据库支持)
下载代码(仅rdlc报表定义文件)
原理:
由于表的分组包含“在起始处分页”和”在结束处分页”的功能,所以我们考虑先将数据分成若干个记录条数为N的组,
再启用“在结束处分页”的功能。
那么,如何分组呢?考虑记录的下标为 0,1,2,3... 的自然数序列,用下标除以N(设为3),得到以下数列:
0 /3 取整:0
1 /3 取整:0
2 /3 取整:0
3 /3 取整:1
4 /3 取整:1
5 /3 取整:1
6 /3 取整:2
所以,我们可以以下标除以3的商的整数值对数据进行分组,则每个分组包含3条数据。当记录条数不能被3整除时,最后一个分组会不足3。分组表达式为 =Int((RowNumber(Nothing) - 1) / N)。
另一个需要考虑的问题是,最后一个分组的记录条数可能不足N,怎样以空白行补齐它呢?考虑TableRow.Visibility.Hidden属性,可通过表达式设置它的状态。为此,我们在详细信息组内额外添加N-1行,如果检查到当前是记录的最后一组最后一条并且该组记录条数不足N时,将Hidden设为Flase;其它情况为True。
表达式为=IIf(RowNumber(Nothing) = CountRows("table1") AndAlso CountRows() <= r,False,True)。其中r从1开始递增。
实现:
1.新建WinForm项目,用报表向导添加一张报表,数据源为AdventureWorksDataSet的Employee数据库表,调整详细信息(这里只选择了表内前面7条数据):
2.(以下都是在报表的设计模式中)在表内添加组,分组表达式为 =Int((RowNumber(Nothing) - 1) / 3),取消包括组头和包括组尾,勾选在结尾处分页:
3.连续插入两行:
4.选择插入的第一行(TableRow3),在Visibility的Hidden属性下选择“表达式”,在打开的文本框内填入
=IIf(RowNumber(Nothing) = CountRows("table1") AndAlso CountRows() <= 1, False, True);同理,在插入的第二行(TableRow4)同位置填入
=IIf(RowNumber(Nothing) = CountRows("table1") AndAlso CountRows() <= 2, False, True):
5.运行程序,可以看到前两页分别只有3条记录,最后一页1条,空白处用空行补齐了:
注意:
如果要在数据集记录条数为0的时候也达到这个效果,只能在数据传递到报表之前预处理,添加一行空记录。
修订:
2010-01-07 发表
2010-01-10 添加“注意”部分,增加了示例代码