这篇文章是网络转载,最近做了一些关于activereport报表的项目,在BS的项目中实现打印的时候碰到一些问题:
1.在用activereport报表时,发布后必须在IIS上配置报表的格式等,我会再写一篇文章专门介绍这些。
2.报表的显示方式有三种,HTML 格式在实现web打印的时候有问题。这个原因不明。但是我们可以选择用ActiveX格式来显示就可以实现web打印,下面的文章就是讲述如何使用active方式来实现web打印。
Web打印是比较麻烦的事情,一般打印控件都需要购买,价格也都不便宜。如果你做的项目小,很明显购买打印控件不是一件划算的事情。我最近帮朋友做了个小系统,需要实现web打印,开始下载了一个据说是破解的打印控件,安装的时候也有注册码,结果使用了三个月报表就不能打开了,真是郁闷啊!没有办法,只能重新做了,研究以后发现使用ActiveReport for .net来实现Web打印是非常方便的,为了方便注册我选用了5.1.0.158版本。在使用过程中出现了一些小问题,现在把它记录下来,希望能够给碰到同样问题的朋友做参考。
一、报错“在位置N处没有任何行”
这个问题是最郁闷的,困扰了我一下午。当绑定数据的时候如果同时绑定reportheader,detail,reportfooter预览的时候就会报“在位置N处没有任何行”的错误,把detail部分换为子报表也不行,最后发现要把reportfooter需要绑定的字段复制粘贴到reportherder里面(设置为隐藏)问题就解决了,例如:在reportfooter里有制单人、制单时间需要绑定,那么就把这两个textBox复制粘贴到reportheader里,OK!问题解决。不知道这是什么原因,估计是ActiveReport for .net本身的BUG把。截图如下:
:
二、“一主多从”的显示
在报表打印中很多情况下都需要显示主从表,还有的时候需要显示一个主表多个从表。一主一从的情况可以直接把从表内容放到detail里,需要显示多个从表的时候就需要使用子报表subReport了,subReport很好用,它能方便的实现从表数据的绑定,使用方法是直接在工具箱中拖放一个subReport到需要显示从表的地方,新建一个空白报表来制作从表。主报表BalanceReport.cs如下:
维修项目从表BalanceItemSub.cs:
维修配件从表BalancePartSub.cs:
一般的在主报表ReportHeader_Format事件中添加后台代码,代码如下:
ActiveReport3 sub = null
;
ActiveReport3 sub1 = null
;
private void ReportHeader_Format(object
sender, EventArgs e)
{
BalanceBillBL objBL = new BalanceBillBL();
int iBalanceID = (int)StringUtil.GetValidateData(TypeCode.Int32, this.BALANCE_BILL_ID.Value);//在主表上获取记录ID
sub = new Report.Balance.BalanceItemSub();
DataSet ds = new DataSet();
int iCount = objBL.GetBalaanceReportItemSubDS(ds, iBalanceID);
sub.DataSource = ds;
sub.DataMember = ds.Tables[0].TableName;
DisposeDsBeforeBind(ds);
this.subRepair.Report = sub;//指定维修项目从表
sub1 = new Report.Balance.BalancePartSub();
DataSet ds1 = new DataSet();
int iCount1 = objBL.GetBalaanceReportTestSubDS(ds1, iBalanceID);
sub1.DataSource = ds1;
sub1.DataMember = ds1.Tables[0].TableName;
DisposeDsBeforeBindPart(ds1);
this.subPart.Report = sub1;//指定维修配件从表
}
三、发布到服务器
开发完成以后需要发布到服务器,在服务器上安装ActiveReport for .net以后需要设置IIS(添加.rpx,.ActiveReport,.ArCacheItem应用程序配置项),如何设置IIS我在这就不说了,网上可以查到。如果已经设置了IIS虚拟目录,在配置了应用程序配置项以后需要删除原来的虚拟目录重新建,否则报表也不能显示。
另外注意:如果是在后台代码中调用打印页面需要指定arview2.cab的路径,不然打印预览的时候不会提示下载控件。代码如下:
protected void Page_Load(object
sender, EventArgs e)
{
if (!IsPostBack)
{
int iBillID =(int)StringUtil.GetValidateData(TypeCode.Int32,base.GetQueryString("BillID", ""));
DataSet ds = new DataSet();
BalanceBillBL objBL = new BalanceBillBL();
int iCount = objBL.GetBalaanceReportTestDS(ds, iBillID);
DisposeDsBeforeBind(ds,iBillID);
WebViewer1.Report = new Report.Balance.BalanceReport();//实例化主报表
WebViewer1.Report.DataSource = ds;
WebViewer1.Report.DataMember = ds.Tables[0].TableName;
WebViewer1.ViewerType = DataDynamics.ActiveReports.Web.ViewerType.AcrobatReader;
WebViewer1.CodeBase = "../Lib/arview2.cab";//如果少了这行代码,发布以后就不会提示下载控件,朋友们可别忘记了,在页面调用的话也需要指定
//arview2.cab路径。
}
}
今天就先写到这里把,以后我会继续关注ActiveReport for .net使用中碰到的问题,并把它记录下来。朋友们有什么问题也可以提出来一起来讨论!