实现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把。截图如下:
:
      
维修项目从表BalanceItemSub.cs:
 

      今天就先写到这里把,以后我会继续关注ActiveReport for .net使用中碰到的问题,并把它记录下来。朋友们有什么问题也可以提出来一起来讨论!
 
一、报错“在位置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 sub = null;
 ActiveReport3 sub1 = null;
        ActiveReport3 sub1 = null;
 private void ReportHeader_Format(object sender, EventArgs e)
        private void ReportHeader_Format(object sender, EventArgs e)
 {
        {
 BalanceBillBL objBL = new BalanceBillBL();
            BalanceBillBL objBL = new BalanceBillBL();
 int iBalanceID = (int)StringUtil.GetValidateData(TypeCode.Int32, this.BALANCE_BILL_ID.Value);//在主表上获取记录ID
            int iBalanceID = (int)StringUtil.GetValidateData(TypeCode.Int32, this.BALANCE_BILL_ID.Value);//在主表上获取记录ID
 sub = new Report.Balance.BalanceItemSub();
            sub = new Report.Balance.BalanceItemSub();
 DataSet ds = new DataSet();
            DataSet ds = new DataSet();
 int iCount = objBL.GetBalaanceReportItemSubDS(ds, iBalanceID);
            int iCount = objBL.GetBalaanceReportItemSubDS(ds, iBalanceID);
 sub.DataSource = ds;
            sub.DataSource = ds;
 sub.DataMember = ds.Tables[0].TableName;
            sub.DataMember = ds.Tables[0].TableName;
 DisposeDsBeforeBind(ds);
            DisposeDsBeforeBind(ds);
 this.subRepair.Report = sub;//指定维修项目从表
            this.subRepair.Report = sub;//指定维修项目从表

 sub1 = new Report.Balance.BalancePartSub();
            sub1 = new Report.Balance.BalancePartSub();
 DataSet ds1 = new DataSet();
            DataSet ds1 = new DataSet();
 int iCount1 = objBL.GetBalaanceReportTestSubDS(ds1, iBalanceID);
            int iCount1 = objBL.GetBalaanceReportTestSubDS(ds1, iBalanceID);
 sub1.DataSource = ds1;
            sub1.DataSource = ds1;
 sub1.DataMember = ds1.Tables[0].TableName;
            sub1.DataMember = ds1.Tables[0].TableName;
 DisposeDsBeforeBindPart(ds1);
            DisposeDsBeforeBindPart(ds1);
 this.subPart.Report = sub1;//指定维修配件从表
            this.subPart.Report = sub1;//指定维修配件从表
 }
三、发布到服务器
        }
三、发布到服务器
开发完成以后需要发布到服务器,在服务器上安装ActiveReport for .net以后需要设置IIS(添加.rpx,.ActiveReport,.ArCacheItem应用程序配置项),如何设置IIS我在这就不说了,网上可以查到。如果已经设置了IIS虚拟目录,在配置了应用程序配置项以后需要删除原来的虚拟目录重新建,否则报表也不能显示。另外注意:如果是在后台代码中调用打印页面需要指定arview2.cab的路径,不然打印预览的时候不会提示下载控件。代码如下: protected void Page_Load(object sender, EventArgs e)
 protected void Page_Load(object sender, EventArgs e)
 {
        {
 if (!IsPostBack)
            if (!IsPostBack)
 {
            { 
 int iBillID =(int)StringUtil.GetValidateData(TypeCode.Int32,base.GetQueryString("BillID", ""));
                int iBillID =(int)StringUtil.GetValidateData(TypeCode.Int32,base.GetQueryString("BillID", ""));

 DataSet ds = new DataSet();
                DataSet ds = new DataSet();
 BalanceBillBL objBL = new BalanceBillBL();
                BalanceBillBL objBL = new BalanceBillBL();
 int iCount = objBL.GetBalaanceReportTestDS(ds, iBillID);
                int iCount = objBL.GetBalaanceReportTestDS(ds, iBillID);
 DisposeDsBeforeBind(ds,iBillID);
                DisposeDsBeforeBind(ds,iBillID);
 WebViewer1.Report = new Report.Balance.BalanceReport();//实例化主报表
                WebViewer1.Report = new Report.Balance.BalanceReport();//实例化主报表
 WebViewer1.Report.DataSource = ds;
                WebViewer1.Report.DataSource = ds;
 WebViewer1.Report.DataMember = ds.Tables[0].TableName;
                WebViewer1.Report.DataMember = ds.Tables[0].TableName;
 WebViewer1.ViewerType = DataDynamics.ActiveReports.Web.ViewerType.AcrobatReader;
                WebViewer1.ViewerType = DataDynamics.ActiveReports.Web.ViewerType.AcrobatReader;
 WebViewer1.CodeBase = "../Lib/arview2.cab";//如果少了这行代码,发布以后就不会提示下载控件,朋友们可别忘记了,在页面调用的话也需要指定                                                                                    //arview2.cab路径。
                WebViewer1.CodeBase = "../Lib/arview2.cab";//如果少了这行代码,发布以后就不会提示下载控件,朋友们可别忘记了,在页面调用的话也需要指定                                                                                    //arview2.cab路径。
 }
            }
 
            
 }
        }

        最终效果:


 ActiveReport3 sub = null;
        ActiveReport3 sub = null; ActiveReport3 sub1 = null;
        ActiveReport3 sub1 = null; private void ReportHeader_Format(object sender, EventArgs e)
        private void ReportHeader_Format(object sender, EventArgs e) {
        { BalanceBillBL objBL = new BalanceBillBL();
            BalanceBillBL objBL = new BalanceBillBL(); int iBalanceID = (int)StringUtil.GetValidateData(TypeCode.Int32, this.BALANCE_BILL_ID.Value);//在主表上获取记录ID
            int iBalanceID = (int)StringUtil.GetValidateData(TypeCode.Int32, this.BALANCE_BILL_ID.Value);//在主表上获取记录ID sub = new Report.Balance.BalanceItemSub();
            sub = new Report.Balance.BalanceItemSub(); DataSet ds = new DataSet();
            DataSet ds = new DataSet(); int iCount = objBL.GetBalaanceReportItemSubDS(ds, iBalanceID);
            int iCount = objBL.GetBalaanceReportItemSubDS(ds, iBalanceID); sub.DataSource = ds;
            sub.DataSource = ds; sub.DataMember = ds.Tables[0].TableName;
            sub.DataMember = ds.Tables[0].TableName; DisposeDsBeforeBind(ds);
            DisposeDsBeforeBind(ds); this.subRepair.Report = sub;//指定维修项目从表
            this.subRepair.Report = sub;//指定维修项目从表
 sub1 = new Report.Balance.BalancePartSub();
            sub1 = new Report.Balance.BalancePartSub(); DataSet ds1 = new DataSet();
            DataSet ds1 = new DataSet(); int iCount1 = objBL.GetBalaanceReportTestSubDS(ds1, iBalanceID);
            int iCount1 = objBL.GetBalaanceReportTestSubDS(ds1, iBalanceID); sub1.DataSource = ds1;
            sub1.DataSource = ds1; sub1.DataMember = ds1.Tables[0].TableName;
            sub1.DataMember = ds1.Tables[0].TableName; DisposeDsBeforeBindPart(ds1);
            DisposeDsBeforeBindPart(ds1); this.subPart.Report = sub1;//指定维修配件从表
            this.subPart.Report = sub1;//指定维修配件从表 }
        }开发完成以后需要发布到服务器,在服务器上安装ActiveReport for .net以后需要设置IIS(添加.rpx,.ActiveReport,.ArCacheItem应用程序配置项),如何设置IIS我在这就不说了,网上可以查到。如果已经设置了IIS虚拟目录,在配置了应用程序配置项以后需要删除原来的虚拟目录重新建,否则报表也不能显示。另外注意:如果是在后台代码中调用打印页面需要指定arview2.cab的路径,不然打印预览的时候不会提示下载控件。代码如下:
 protected void Page_Load(object sender, EventArgs e)
 protected void Page_Load(object sender, EventArgs e) {
        { if (!IsPostBack)
            if (!IsPostBack) {
            {  int iBillID =(int)StringUtil.GetValidateData(TypeCode.Int32,base.GetQueryString("BillID", ""));
                int iBillID =(int)StringUtil.GetValidateData(TypeCode.Int32,base.GetQueryString("BillID", ""));
 DataSet ds = new DataSet();
                DataSet ds = new DataSet(); BalanceBillBL objBL = new BalanceBillBL();
                BalanceBillBL objBL = new BalanceBillBL(); int iCount = objBL.GetBalaanceReportTestDS(ds, iBillID);
                int iCount = objBL.GetBalaanceReportTestDS(ds, iBillID); DisposeDsBeforeBind(ds,iBillID);
                DisposeDsBeforeBind(ds,iBillID); WebViewer1.Report = new Report.Balance.BalanceReport();//实例化主报表
                WebViewer1.Report = new Report.Balance.BalanceReport();//实例化主报表 WebViewer1.Report.DataSource = ds;
                WebViewer1.Report.DataSource = ds; WebViewer1.Report.DataMember = ds.Tables[0].TableName;
                WebViewer1.Report.DataMember = ds.Tables[0].TableName; WebViewer1.ViewerType = DataDynamics.ActiveReports.Web.ViewerType.AcrobatReader;
                WebViewer1.ViewerType = DataDynamics.ActiveReports.Web.ViewerType.AcrobatReader; WebViewer1.CodeBase = "../Lib/arview2.cab";//如果少了这行代码,发布以后就不会提示下载控件,朋友们可别忘记了,在页面调用的话也需要指定                                                                                    //arview2.cab路径。
                WebViewer1.CodeBase = "../Lib/arview2.cab";//如果少了这行代码,发布以后就不会提示下载控件,朋友们可别忘记了,在页面调用的话也需要指定                                                                                    //arview2.cab路径。 }
            } 
             }
        } 
                    
                 
 
        
 
             
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号