一、报错“在位置N处没有任何行”
这个问题是最郁闷的,困扰了我一下午。当绑定数据的时候如果同时绑定reportheader,detail,reportfooter预览的时候就会报“在位置N处没有任何行”的错误,把detail部分换为子报表也不行,最后发现要把reportfooter需要绑定的字段复制粘贴到reportherder里面(设置为隐藏)问题就解决了,例如:在reportfooter里有制单人、制单时间需要绑定,那么就把这两个textBox复制粘贴到reportheader里,OK!问题解决。不知道这是什么原因,估计是ActiveReport for .net本身的BUG把。截图如下:
:

二、“一主多从”的显示
在报表打印中很多情况下都需要显示主从表,还有的时候需要显示一个主表多个从表。一主一从的情况可以直接把从表内容放到detail里,需要显示多个从表的时候就需要使用子报表subReport了,subReport很好用,它能方便的实现从表数据的绑定,使用方法是直接在工具箱中拖放一个subReport到需要显示从表的地方,新建一个空白报表来制作从表。主报表BalanceReport.cs如下:
在报表打印中很多情况下都需要显示主从表,还有的时候需要显示一个主表多个从表。一主一从的情况可以直接把从表内容放到detail里,需要显示多个从表的时候就需要使用子报表subReport了,subReport很好用,它能方便的实现从表数据的绑定,使用方法是直接在工具箱中拖放一个subReport到需要显示从表的地方,新建一个空白报表来制作从表。主报表BalanceReport.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以后需要设置IIS(添加.rpx,.ActiveReport,.ArCacheItem应用程序配置项),如何设置IIS我在这就不说了,网上可以查到。如果已经设置了IIS虚拟目录,在配置了应用程序配置项以后需要删除原来的虚拟目录重新建,否则报表也不能显示。另外注意:如果是在后台代码中调用打印页面需要指定arview2.cab的路径,不然打印预览的时候不会提示下载控件。代码如下:





















