问题描述:
有多个不同的报表(即多个不同的rpt文件)统称为A表,每个报表下又有多个不同的子表(即多个不同的rpt文件)或多个同类型的
子表(有的高达上千个)统称为B表。(当然A表和B表之间有一关键字进行关联,且A表有唯一编号,B表在A表子表中有唯一编号)
现在系统(B/S)中实现的是单个报表的打印,即点击打印按钮,弹出相应水晶报表预览页,再点击工具栏中“打印”完成一个报
表的打印。
现在客户提出新的需求:
1) 通过输入条件查询出满足条件的A表或B表
2) 批量打印所有查询结果
需考虑的问题:
1) B/S还是C/S实现(B/S会不会够呛?)
2) 查询结果显示为A表还是B表?
3) 批量打印时肯定不实现全部预览,考虑实现单个报表的预览
4) 如何实现这个批量打印(可以充分利用原有的rpt文件)
【B/S水晶报表批量打印的解决方案】
现有环境条件及客户需求:
B/S系统中水晶报表单个打印已经完成,现在客户要求在现有基础上实现报表的批量打印,即选择多条记录点击"打印"按钮后即可以一次性打印所有报表。
分析与思考:
1.B/S中要实现批量打印首先排除传统的报表预览打印,只有通过循环报表关键字生成报表后直接打印,但C#中PrintToPrinter方法只能打印至服务器端打印机,通过在服务器端安装各客户端打印机驱动并提供用户选择打印机界面即可解决问题。
2.如果选择报表过多,循环势必过长,这样用户等待时间就长,为了让用户感觉等待时间为0可用后台进程处理,即把循环打印的方法放入新创建的进程中。
开发过程中注意到有关事项:
1.创建报表后直接打印至服务端
ReportDocument rDoc = 创建的报表;
rDoc.PrintOptions.PrinterName = 选择打印机名称;
rDoc.PrintToPrinter(1,false,0,999);
2.枚举服务端打印机列表
private void getPrintList()
{
if(System.Drawing.Printing.PrinterSettings.InstalledPrinters.Count == 0)
{
this.Alert("服务器没有安装打印机!");
return;
}
PrintDocument pDoc = new PrintDocument();
string strDefaultPrinter = pDoc.PrinterSettings.PrinterName;//获取默认打印机
foreach(string strPrinter in PrinterSettings.InstalledPrinters)
{
lbxPrintList.Items.Add(strPrinter);
if(strPrinter == strDefaultPrinter)
{
lbxPrintList.SelectedValue = strPrinter;
}
}
}
3.创建线程
1) 线程中方法要用到的参数必须通过Session获取
2) HttpContext.Current方法在线程中的方法中无效,须在创建线程前调用(通过创建新类或Session传递)
Thread trd = new Thread(new ThreadStart(PintTask));