FastReport .Net 功能实现——每条数据重复显示
在程序的使用过程中,我们可能会遇到这样的需求:
两条数据记录:A和B,希望A可以打印2次,B可以打印3次。
当然,我们有一个固定的字段用来表示这条数据需要打印几次。
那么我们应该怎么去实现这个需求呢?
方法1,直接处理数据:
要知道,FastReport的数据区 显示多少数据 都是 数据源 决定的,那么我们就可以在数据传入报表之前,提前处理好这些数据,让这些数据根据要打印的次数进行重复,就可以直接实现这个需求。
处理前我们的数据是这样的:
数据 | 重复次数 |
---|---|
A | 2 |
B | 3 |
处理之后我们的数据是这样的:
数据 | 重复次数 |
---|---|
A | 2 |
A | 2 |
B | 3 |
B | 3 |
B | 3 |
我们将处理后的数据传入报表,就可以实现所谓的“重复显示”了。
方法2,通过代码修改数据区的重复次数属性:
随着对FastReport的深入了解,我发现了数据区有一个属性:RepeatBandNTimes,这个属性指示了数据区的重复次数,但是在设计器上只能是一个固定的数字。
我就考虑,是否可以通过代码脚本的方式对这个属性的值进行修改,以实现每行数据重复不同的次数呢?
说干就干,绑定数据区的BeforePrint事件,并写入以下代码:
private void Data1_BeforePrint(object sender, EventArgs e)
{
TableDataSource tds = (TableDataSource)this.Report.GetDataSource("Dt1");
DataRow currentRow = tds.CurrentRow as DataRow;
Data1.RepeatBandNTimes = (int)currentRow["repeatCount"];
}
其中,Dt1 是数据表的名称,repeatCount 是重复次数所在的列名。
预览后得到了预期的报表结果,此方法可行。
方法3,通过代码加载表格控件的数据:
首先说明,此方法需要对 FastReport 的底层原理有一定的了解,至少要读懂 Demo 中 Row Datasource 加载数据的原理
直接在该 Demo 下进行修改代码:
private void Table1_ManualBuild(object sender, EventArgs e)
{
// get the data source by its name
DataSourceBase rowData = Report.GetDataSource("Products");
// init the data source
rowData.Init();
// print the first table row - it is a header
Table1.PrintRow(0);
// each PrintRow call must be followed by either PrintColumn or PrintColumns call
// to print cells on the row
Table1.PrintColumns();
// 用于记录数据行打印次数
int printTimes = 0;
// now enumerate the data source and print the table body
while (rowData.HasMoreRows)
{
// print the table body
Table1.PrintRow(1);
Table1.PrintColumns();
// 数据行打印次数 +1
printTimes ++;
// 如果没有到重复的次数,不进入下一个数据行,继续打印当前数据行
if (Convert.ToInt32((rowData.CurrentRow as DataRow)["CategoryID"]) > printTimes)
{
continue;
}
// go next data source row
rowData.Next();
// 重置数据行打印次数
printTimes = 0;
}
// print the last table row - it is a footer
Table1.PrintRow(2);
Table1.PrintColumns();
}
预览,对 Demo 魔改成功,实现了根据 CategoryID 列的数值进行重复打印的想法。
总结
以上三种方法中,建议使用 方法1 的方式实现重复打印的需求。