ActiveReport在.net中的简单应用

先上图,最终效果如下:

image

可以连续打印。

具体功能就是大报表里面再套一个子报表。

考察了几个报表控件,在b/s下面ActiveReport还是比较好用的,简单,实用

具体步骤如下:

1、安装ActiveReports for .NET 3.0 Setup.exe,到官网自己下。

2、用自己的金钱、魅力、或者智慧注册之~~~~~不注册也可以用,不过报表上会有红色字体提示。

3、在项目中新建报表文件

image

4、在新建的报表文件上右键选择“视图设计器”,直接双击的话就会用vs代码编辑器打开,这里b/s和c/s是不一样的。c/s里面双击就是视图设计器了。

image

5、和设计网页一样,在页面上布置各种控件

image

画完的页面如下:

image

在左上角的地方有个按钮,image ,这里面可以更改报表的信息,如纸张大小、纸张方向等,我选的就是A4纸、横向

image

这里不多说了,注意设定好页面里面每个地方的绑定字段,另外在右侧有一个子报表SubReport,在这里

image

 

 

 

 

这个放后面说~~~

点上面的数据库图标可以直接连接数据库进行测试,这个自己试验就ok,实际应用时都是用代码控制,这里控制太不灵活。另外需要说明的一点是,可以在这里把测试数据提取出来,方便选择每个地方的字段~~~不多说了,看图

image

6、下面开始做现实报表的网页

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ZhunKaoZheng.aspx.cs" Inherits="ExamSys.Report.ZhunKaoZheng" %>  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title></title> <meta name="GENERATOR" content="Microsoft Visual Studio 7.0"> <meta name="CODE_LANGUAGE" content="C#"> <meta name="vs_defaultClientScript" content="VBScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> <link rel="stylesheet" type="text/css" href="default.css"> </head> <body> <form id="ActiveXExport" method="post" runat="server"> </form>  <div id="pagebody">  <object id="arv" codebase="arview2.cab#version=-1,-1,-1,-1" height="800" width="100%" classid="clsid:8569D715-FF88-44BA-8D1D-AD3E59543DDE" viewastext> <param name="_ExtentX" value="26141"> <param name="_ExtentY" value="11959"> </object> <script language="vbscript"> <!-- sub arv_ControlLoaded() arv.DataPath = "ZhunKaoZheng.aspx?ReturnReport=1" end sub --> </script>  </div> </body> </html> 

需要注意的是我这个控件是引用在form外面的,在里面不好使哦!!!

还有这个

arv.DataPath = "ZhunKaoZheng.aspx?ReturnReport=1" 是必须加的,记得ZhunKaoZheng.aspx就是本页面的地址,具体为什么加我也不知道,谁知道为啥记得告诉我哦。
后台代码如下:
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.IO; using DataDynamics.ActiveReports; using ExamSys.DBUtility; using System.Data.SqlClient; using System.Data;  namespace ExamSys.Report { public partial class ZhunKaoZheng : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string strSql=""; if (Session["personid"].ToString() != "" && Session["personid"] != null) {   strSql = @"SELECT T_PERSON.ID, T_PERSON.NAME, T_PERSON.PHOTO,  T_PERSON.BH_SHENFENZHENG, T_PERSON.BAOMING_NO, T_PERSON.DEP,  ExamUser.examID, T_PERSON.DEP_BIANHAO,  T_INFO.NAME AS DEP_NAME, ExamList.elClass FROM ExamList INNER JOIN ExamUser ON ExamList.elID = ExamUser.elID INNER JOIN T_PERSON ON ExamUser.personID = T_PERSON.ID INNER JOIN T_INFO ON T_PERSON.DEP_BIANHAO = T_INFO.ID WHERE (T_PERSON.ID = '" + Session["personid"].ToString() + @"')";  }       else {   strSql = @"SELECT T_PERSON.ID, T_PERSON.NAME, T_PERSON.PHOTO,  T_PERSON.BH_SHENFENZHENG, T_PERSON.BAOMING_NO, T_PERSON.DEP,  ExamUser.examID, T_PERSON.DEP_BIANHAO,  T_INFO.NAME AS DEP_NAME, ExamList.elClass FROM ExamList INNER JOIN ExamUser ON ExamList.elID = ExamUser.elID INNER JOIN T_PERSON ON ExamUser.personID = T_PERSON.ID INNER JOIN T_INFO ON T_PERSON.DEP_BIANHAO = T_INFO.ID WHERE (T_PERSON.DEP_BIANHAO = '" + Session["dep"].ToString() + @"') AND (ExamUser.elID IN (SELECT ELID FROM EXAMLIST AS EXAMLIST_1 WHERE (ELCLASS = '" + Session["bigtitle"].ToString() + "')))";  } strSql = strSql.Replace("\r", " ").Replace("\n", " "); DataSet myDS = SQLHelper.GetDataSet(strSql); DataTable myDT = GetDistinctTable(myDS.Tables[0], "id");    string sReturnReport = this.Page.Request.QueryString["ReturnReport"]; if ((sReturnReport != null) && (sReturnReport.Trim().Length != 0)) { this.Page.Response.Buffer = true; ActiveReport3 rpt = null; try { //这两句话是重点 rpt = new rptZhunKaoZheng(); rpt.DataSource = myDT; rpt.DataMember = myDT.TableName; rpt.Run(false); } catch (DataDynamics.ActiveReports.ReportException eRunReport) { this.Trace.Warn("Report failed to run:\n" + eRunReport.ToString()); } MemoryStream outStream = new MemoryStream(); rpt.Document.Save(outStream, DataDynamics.ActiveReports.Document.RdfFormat.AR20); outStream.Seek(0, SeekOrigin.Begin); byte[] bytes = new byte[outStream.Length]; outStream.Read(bytes, 0, (int)outStream.Length); this.Page.Response.ClearContent(); this.Page.Response.ClearHeaders(); this.Page.Response.BinaryWrite(bytes); this.Page.Response.End(); } }   /// <summary> /// 获取对固定列不重复的新DataTable /// </summary> /// <param name="dt">含有重复数据的DataTable</param> /// <param name="colName">需要验证重复的列名</param> /// <returns>新的DataTable,colName列不重复,表格式保持不变</returns> private DataTable GetDistinctTable(DataTable dt, string colName) { DataView dv = dt.DefaultView; DataTable dtCardNo = dv.ToTable(true, colName); DataTable Pointdt = new DataTable(); Pointdt = dv.ToTable(); Pointdt.Clear(); for (int i = 0; i < dtCardNo.Rows.Count; i++ ) { string ss=dtCardNo.Rows[i][0].ToString(); DataRow dr = dt.Select(colName +"="+ ss)[0]; Pointdt.Rows.Add(dr.ItemArray); } return Pointdt; }  } } 

为了确保能看的清楚,无关的代码我也不删除了。里面最重要的是

                    rpt = new rptZhunKaoZheng();
                    rpt.DataSource = myDT;
                    rpt.DataMember = myDT.TableName;
                    rpt.Run(false);
7、这样主报表就现实成功了,下面开始子报表的制作~~

8、同样的方法建立子报表模板

image

 

 

 

注意里面的标题栏为groupHeader,子报表的标题一定要选这个,不然不能在主报表里面现实,可以右键选择添加、删除标题栏

image

在里面设定好需要显示的字段就O了

9、更改主报表

1)选择主报表的detail模块,添加Format事件,这里面主要设置子报表的DataSource和DataMember

image

private void detail_Format(object sender, EventArgs e) { //string strSql1 = "SELECT EXAMLIST.ELNAME, SiteInfo.siName, T_PSSBSchema.seatnum, ExamOrder.eoBegin, ExamOrder.eoEnd FROM T_PSSBSchema INNER JOIN SiteInfo ON T_PSSBSchema.siID = SiteInfo.siID INNER JOIN ExamOrder ON SiteInfo.siID = ExamOrder.siID INNER JOIN EXAMLIST ON T_PSSBSchema.elID = EXAMLIST.ELID AND ExamOrder.elID = EXAMLIST.ELID WHERE (T_PSSBSchema.examID = '" + this.label9.Text + "')"; string strSql = @"SELECT ExamList.elName, SiteInfo.siName, ExamUser.seatnum, ExamOrder.eoBegin,  ExamOrder.eoEnd FROM ExamUser INNER JOIN SiteInfo ON ExamUser.siID = SiteInfo.siID INNER JOIN ExamOrder ON SiteInfo.siID = ExamOrder.siID INNER JOIN ExamList ON ExamUser.elID = ExamList.elID AND  ExamOrder.elID = ExamList.elID WHERE (ExamUser.examID = '" + this.label9.Text + "')"; strSql = strSql.Replace("\r", " ").Replace("\n", " "); DataTable myDT = SQLHelper.GetDataSet(strSql).Tables[0]; Time2CharConvert(myDT, "eoBegin", "f"); Time2CharConvert(myDT, "eoEnd", "t"); this.srptKaoChang.Report.DataSource = myDT; this.srptKaoChang.Report.DataMember = myDT.TableName; //((DataDynamics.ActiveReports.DataSources.SqlDBDataSource)this.srptKaoChang.Report.DataSource).ConnectionString = "data source=127.0.0.1;initial catalog=kuaiji;password=sa;persist security info=True;user id=sa"; //((DataDynamics.ActiveReports.DataSources.SqlDBDataSource)this.srptKaoChang.Report.DataSource).SQL = "SELECT EXAMLIST.ELNAME, SiteInfo.siName, T_PSSBSchema.seatnum, ExamOrder.eoBegin, ExamOrder.eoEnd FROM T_PSSBSchema INNER JOIN SiteInfo ON T_PSSBSchema.siID = SiteInfo.siID INNER JOIN ExamOrder ON SiteInfo.siID = ExamOrder.siID INNER JOIN EXAMLIST ON T_PSSBSchema.elID = EXAMLIST.ELID AND ExamOrder.elID = EXAMLIST.ELID WHERE (T_PSSBSchema.examID = '" + this.label9.Text + "')";  }

10、选择报表主体,添加ReportStart和ReportEnd事件。

image

rptKaoChang _rptKaoChang = null;
private void rptZhunKaoZheng_ReportStart(object sender, EventArgs e) { //Check to see if the holder subreport object is assigned, if not create it //Creating the subreport here will only create one instance to use  if (_rptKaoChang == null) { _rptKaoChang = new rptKaoChang(); this.srptKaoChang.Report = _rptKaoChang; this.srptKaoChang.Report.DataSource = new DataDynamics.ActiveReports.DataSources.SqlDBDataSource(); } }  private void rptZhunKaoZheng_ReportEnd(object sender, EventArgs e) { //clean up existing subreport document object _rptKaoChang.Document.Dispose(); //clean up existing subreport object _rptKaoChang.Dispose(); //Reset subreport to null, so if this report is called again it will reinit inside the section format event _rptKaoChang = null; }

在此进行子报表的初始化和关闭。

11、结束战斗,测试OK~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
摘要 ActiveReports for .NET 是最畅销的ActiveReports 引擎和报表浏览器。其功能和灵活性与ActiveReports 2.0相同,并提供了完整的.NET环境下的代码集成。使用.NET 版的ActiveReports,你可以采用Visual Studio.NET 编辑器,用C#或Visual Basic .NET 语言编写报表代码,其包含了ASP.NET 服务器控件,帮助您安装web客户端浏览器以及WinForms浏览器控件,以提供单页浏览,多页浏览,文本搜索,内容列表和定制工具栏等功能。 组件列表 技术特性 支持ASP.NET-ActiveReports在WebForms应用程序通过使用ASP.NET 服务器控件来使用。这个控件支持分布式web报表,可使用HTML,ActiveX,.NET 和PDF浏览器。 完全代码集成-使用Microsoft Visual Studio.NET编辑器用C#或VB.NET编写报表的代码,非常灵活。 报表向导-报表向导帮助您开始创建使用集成设计器来定制的简单报表。 图片文件名 运用优势 最终用户报表设计器 终端用户设计器提供了向应用程序添加报表设计器的功能,同时提供了最终用户报表编辑功能。 控件的方法和属性能方便的存储和加载报表布局,监测和控制设计环境,并可根据终端用户的需要定制外观。 与ASP.NET集成 Web浏览器控件为您提供了web上的快速浏览ActiveReports 以及打印功能,并具有ActiveX,Acrobat Reader HTML,EXCEL浏览器类型的属性。 RPX 文件HTTP处理器为您提供了在web服务器上轻松的放置报表的功能,并可使您的Internet用户采用HTML 或PDF进行浏览,而不需要编写任何代码。 编译的报表HTTP处理器提供了直接访问服务器的程序集编译的ActiveReports,而不需要编写任何ASPX页面。 发布-容易部署 报表引擎是一个简单处理强名称程序集。程序集可以使用XCopy发布或放置于程序集全局存储器(GAC)。 专业版包括HTTP 处理器和服务器并行web控件,用于ASP.NET 报表。 设计器-容易学习 与.NET 环境完全集成 熟悉的用户界面 支持C#和Visual Basic.NET 报表将作为您应用程序的一部分进行编译,以加快处理速度,增强安全性,并且用户可以有选择地分别发布。 初学者报表向导和Microsoft Access 报表导入向导 设计器拥有第三方控件(图表控件,图像控件等)。 数据访问-容易连接 具有OLEDB和SqlClient报表数据源 具有灵活的xml数据源 绑定到Dataset,DataView,DataTable和任何IListSource 控件 数据源属性能在运行时修改,生成ad hoc(动态)报表 灵活的非绑定数据 预览和输出-容易显示 支持C#代码 小型部署程序集,适用于Internet 上使用 TOC/Bookmarks 超链接 输出过滤文件格式为RTF、PDF、EXCEL、HTML、TIFF 和文本文件。 开发环境 VB .NET/C# .NET/ASP.NET 支持平台 Windows2000/XP 电话 021-58549800 Email: tools@sh.grapecity.com http://www.grapecity.com/china
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值