《RDLC使用手册v2.doc》由会员分享,可在线阅读,更多相关《RDLC使用手册v2.doc(20页珍藏版)》请在课桌文档上搜索。
1、RDLC使用手册RDLReport Definition Language是报表定义语言的缩写。那么微软为何后来又提出RDLC,即在RDL根底上加CC代表Client-side processing,这是,同时也凸显了RDLC的客户端处理能力。由于微软MSDN和网络上对于RDLC的介绍比拟少MSDN只是一些控件简单介绍,至于其它网络上除了蜡人X的博文waxdoll.blogs./比拟完整、系统外,就没有更有价值的参考资料,本人就冒充大侠,介绍一下本人对RDLC的认识,主要有下述几方面内容:1) 为什么要使用RDLC报表;2) RDLC简单Demo;3) RDLC规X简介;4) RDLC常用控件
2、介绍;5) RDLC参数介绍;6) RDLC钻取功能实现;7) RDLC自定义工具条;8) RDLC设计器实现;本手册提供的相关资料列表:1) RDLC规X;2) 本手册DEMO程序;3) RDLC自定义打印程序;4) RDLC设计器程序;1、 为什么要使用RDLC报表为什么要使用RDLC报表,蜡人X在其博文“RDLC报表一中已经很好的阐述了这一点。“严密集成Crystal Report后,这可能是开发人员比拟单一的选择。但是,这种集成似乎并不非常严密,网络上充斥着关于使用Crystal Report的各种抱怨,太复杂也许是其最为令人诟病的地方,自定义性比拟差也不能为程序员们所容忍。当然,必须
3、承认Crystal Report的功能还是非常强大的,被Business Object收购以后,商业的成分也在逐渐增加,也形成了一定规模的用户群。Visual Studio .NET进入2005版本以后,Crystal Report与IDE的结合更“严密了,至少我们看不到那个讨厌的注册窗口了。但是,Microsoft似乎并不容忍在自己的超级工具中竟然没有报表工具,于是Report Viewer Control出现了,我把它的报表称为RDLC报表。在VS .NET 2005之前,SQL Server Reporting Services中已经提供了一种被称为报表定义语言Report Defini
4、tion Language, RDL的语言;在VS .NET 2005中,Microsoft提供了针对这种报表的设计器,并提供了在WinForm和WebForm中使用这种报表的能力。Microsoft将这种报表的后缀定为RDLC,RDL仍然是Report Definition Language的缩写,那么C代表什么呢?C代表Client-side processing,凸显了它的客户端处理能力。这种报表的易用性和可定制性让我们完全有理由放弃Crystal Report,让我们来看看它的强大功能吧:1) 简单易用的控件,特别是Table控件,非常方便字段在报表上的排列;2) 灵活的可定制性,用X
5、ML来描述一个报表相关的一切,不用说了吧;3) 高度可编程性,在你的项目中,甚至不需要有一个报表文件,通过代码就可以实现报表生成、预览和打印等一系列操作;4) 支持DrillThrough数据钻取功能;5) 导出的Excel文件格式非常完美,而且并不需要安装Excel;6) 数据源处理极其方便,开发人员可以自己接收数据库连接、取数,然后将数据结果赋值给RDLC的数据集即可。7) 展示和数据别离,程序员更是可以编写一个RDLC设计器交有用户使用,这样用户就可以自行设计RDLC报表格式,程序员只负责定制数据接口即可。RDLC MSDN:msdn.microsoft./zh-/library/ms2
6、51671(VS.80).aspx2、 RDLC简单Demo本文所有RDLC例子都是基于VS2005 C#,所有ReportViewer的处理模式都是Local模式。本报表Demo显示上文中提到的RDLC手册各节内容,下述为Demo的详细steps。1) 新建项目,选择Windows应用程序项目类型,输入工程名称RDLCDev;2) 修改Form1窗体名称为FrmRdlcUserGuide,在工具箱数据Tab选项卡中选择ReportViewer控件,将其拖入到FrmRdlcUserGuide,默认命名为reportViewer1,调整ReportViewer控件的大小和布局;3) 在解决方案资
7、源管理器中选择RDLCDev工程,鼠标右击RDLCDev工程,添加新建项,在添加新项模板中选择“报表,取名为rdlcus,单击添加按钮,然后在解决方案资源管理器中RDLCDev工程下会增加一个文件,并且会自动打开RDLC设计器;4) 在RDLC设计器中添加11个TextBox控件,1个作为标题,其余10个作为RDLC使用手册具体内容,对每个TextBox控件进展TextAlign、Color、BorderStyle、Font和TextDecoration等相关属性设置,设计完毕之后,大致如如下图所示。5) 在FrmRdlcUserGuide窗体Load事件中添加下述代码privatevoid
8、Form1_Load(object sender, EventArgs e) this.reportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local;this.reportViewer1.LocalReport.ReportPath = rdlcuserguide.rdlc;this.reportViewer1.RefreshReport(); 6) 编译、运行RDLCDev工程,运行结果大致如如下图所示。3、 RDLC规X简介微软的RDLC协议规X定义了什么是报表?描绘了RDLC的报表定义关系
9、图,报表定义的XML描述,元素定义,表达式等内容。1) 协议规X对报表的定义A report is a bination of three kinds of information:Data or information on how to obtain the data (queries) as well as the structure of the data.Layout or formatting information that describes how the data is presented.Properties that the report such as author,
10、 parameters, images within the report, etc.2) 报表定义关系图,6X关系图是RDLC协议规X的核心内容,了解掌握了这些关系图根本上也就掌握了RDLC报表。协议规X中还有另外3XFigure:Table、Matrix和Chart,在下节RDLC常用控件介绍中附上。3) 协议规X还介绍了RDLC报表常用的表达式、元素定义等内容,具体请大家参看协议规X。4、 RDLC常用控件介绍RDLC设计工具箱上总共有9种控件:文本框(TextBox)、折线(Line)、表(Table)、矩阵(Matrix)、矩形(Rectangle)、列表(List)、子报表(Sub
11、Report)、图表控件(Chart)、图像控件(Image)。如下图ctlsDemo.rdlc设计器所示为所有控件的设计演示。1) 由于表格控件、矩阵控件、列表控件和图表控件必须填充数据集,因此把所有控件布局完毕之后,创建一个数据集。解决方案资源管理器中,选中RDLCDev工程,右击添加新建项,在新建项类型模板里选择“数据集,取名“,单击“添加。ctlsDemo.xsd添加完毕之后,在解决方案资源管理器中会增加一个ctlsDemo.xsd文件,并前VS IDE会自动打开ctlsDemo.xsd设计页面。在设计页面中右击,添加Datatable,将其命名为vSales,该表描述的是产品的销售额
12、信息,为vSales表添加列,列信息如下: ProdCat SubCat OrderYear OrderQtr2) 文本框控件、折线控件、矩形控件使用相对简单,这里不细说;3) Image控件,现在RDLC设计器模式下,选择“报表菜单,“嵌入图像,在“嵌入图像对话框中,载入一个本地图像文件即可。然后设置Image控件的Source属性为Embedded,设置Value属性为刚刚处理的嵌入图像即可。当然还有别的方式可以显示图像,大家可以Google一下,关键字为RDLC、嵌入图像;4) 图表控件,使用图表控件的一个关键是要设置好图表属性页面中的数据TAB页相关内容。主要有值、类别组和序列组定义,
13、大家可以参考Demo;5) 表格控件、矩阵控件和子报表控件,在后续内容中会详细介绍;4.1 表格控件使用介绍1) Table控件是RDLC报表显示数据的一个核心控件,关于Table控件,在微软提供的RDLC规X里有详细的介绍,其大致内容可以用下述的一X类UML图来表示;2) 新建报表文件,命名为ctlTableDemo.rdlc;3) 在ctlTableDemo.rdlc设计器中,拖入Table控件,默认情况下是3行3列,其中第1行为表头行我们理解为列标题行,第二行为详细信息行我们理解为报表内容展示区域,第三行为表尾行我们理解为汇总区域。可以整行选中,然后右击鼠标添加行或者删除行,也可以整列选
14、中,然后右击鼠标添加或者删除列。上文中提到的数据集合有5个字段,因此需要5列来显示,为此需要增加两列。4) 在数据源窗口中如果没有显示的话,选择【数据】菜单下的【显示数据源】即可选择上文中创建的ctlsDemo.xsd数据集,将ProdCat、SubCat、OrderYear、OrderQtr和Sales分别拖入到Table控件的详细信息行的不同列中去。5) 设置标题行文字显示都居中,Sales的内容显示右对齐,ProdCat、SubCat、OrderYear、OrderQtr和Sales文本框的字体颜色全部设置成Blue,Sales文本框由于显示的内容为销售额,因此需设置数字显示格式,小数位
15、数。鼠标右击Sales文本框,选择【属性】,在文本框属性窗口中,选择格式Tab页,在格式代码处,选择数字1,234.00格式即可,选择完毕之后该文本框的数字就以逗号千分位作为分割符,保存2位小数显示,效果如如下图所示。6) 插入一个组实现分组统计功能。选中整行,鼠标右击,选择【插入组】,弹出分组和排序属性对话框,设置分组名称、分组方式、是否显示组头或者组尾等属性即可,本文分组设置如下:分组名称:table1_Group1分组表达式:;,实现产品年度销售额汇总统计功能。不显示组头、显示组尾至于组头、组尾是个什么样的东西,大家只要动手试一下就一目了然了在textbox15中输入汉字“合计,在tex
16、tbox16文本框中输入合计表达式=Sum(CDbl(Fields!Sales.Value),设置完之后效果如如下图所示。7) 新建窗体FrmCtlTableDemo,然后在该窗体上添加ReportViewer控件,在窗体FrmCtlTableDemo代码窗口里输入以下代码:privatevoid FrmCtlTableDemo_Load(object sender, EventArgs e) this.reportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local;this.reportView
17、er1.LocalReport.ReportPath = rdlcctlTableDemo.rdlc;/ reportViewer1.LocalReport.DataSources.Add(newReportDataSource(ctlsDemo_vSales, LoadData();/this.reportViewer1.RefreshReport(); privateDataTable LoadData() DataSet dataSet = newDataSet(); dataSet.ReadXml(datactlsDemo.xml);return dataSet.Tables0; 8)
18、 运行效果如如下图所示4.2 矩阵控件使用介绍1) 矩阵控件主要用于显示CrossTable之类的报表,因此其列数可以是Static的,也可以是Dynamic并且Can grow的,关于矩阵控件,在RDLC协议规X里也有介绍,其大致内容可以用如下图表示。2) 新建报表文件,命名为ctlMatrixDemo.rdlc;3) 在ctlMatrixDemo.rdlc设计器中,拖入Matrix控件,默认情况下是2行2列,左上角单元格为空白区域通常用来显示报表摘要信息如产品/年度等,右上单元格显示为“列,单击此处可以增加列分组,左下单元格显示为“行,单击此处可以添加行分组,右下单元格显示为“数据,单击此
19、处可以添加静态行、静态列。4) 在矩阵左上角单元格空白区域拖入矩形控件,然后在该矩形控件中拖入一个折线控件和两个文本框控件,折线当做矩形的对角线,两个文本框内容为产品和年度分布在折线两侧。5) 增加两个行分组,分别为matrix1_RowGroup1和matrix1_RowGroup2,matrix1_RowGroup1的表达式为,matrix1_RowGroup2的表达式为。6) 增加两个列分组,分别为matrix1_ColumnGroup1何matrix1_ColumnGroup2,matrix1_ColumnGroup1的表达式为,matrix1_ColumnGroup2的表达式为。7)
20、 在“数据单元格中编辑表达式=Sum(CDbl(Fields!Sales.Value)8) 设计完之后,效果如如下图所示;9) 新建窗体FrmCtlMatrixDemo,然后在该窗体上添加ReportViewer控件,在窗体FrmCtlMatrixDemo代码窗口里输入以下代码:privatevoid FrmCtlMatrixDemo_Load(object sender, EventArgs e) this.reportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local;this.reportV
21、iewer1.LocalReport.ReportPath = rdlcctlMatrixDemo.rdlc;/ reportViewer1.LocalReport.DataSources.Add(newReportDataSource(ctlsDemo_vSales, LoadData();/this.reportViewer1.RefreshReport(); privateDataTable LoadData() DataSet dataSet = newDataSet(); dataSet.ReadXml(datactlsDemo.xml);return dataSet.Tables0
22、; 10) 运行效果如如下图所示4.3 子报表控件使用介绍子报表作为主报表的一个补充,在显示明细内容的时候比拟管用,本文从如何填充子报表数据,如何传递参数两方面介绍子报表如何使用。1) 新建RDLC报表,命名为subReportDemo.rdlc;2) 在subReportDemo.rdlc设计器中,拖入一个文本框和一个子报表控件;3) 设置文本框的文本显示为“子报表控件演示;4) 设置子报表控件属性,主要设置其“子报表的值,这里设为上文讲到的ctlTableDemo报表,效果如如下图所示;5) 新建一个窗体FrmSubReportDemo,添加如下代码privatevoid FrmCtlSu
23、bReportDemo_Load(object sender, EventArgs e) reportViewer1.LocalReport.SubreportProcessing += newSubreportProcessingEventHandler(LocalReport_SubreportProcessing);/this.reportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local;this.reportViewer1.LocalReport.ReportPath = rdlcsub
24、ReportDemo.rdlc;/ reportViewer1.LocalReport.DataSources.Add(newReportDataSource(ctlsDemo_vSales, LoadData();/this.reportViewer1.RefreshReport(); void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e) e.DataSources.Add(newReportDataSource(ctlsDemo_vSales, LoadData(); priv
25、ateDataTable LoadData() DataSet dataSet = newDataSet(); dataSet.ReadXml(datactlsDemo.xml);return dataSet.Tables0;这里,区别于其它显示RDLC报表程序的代码就是对子报表的处理,本文在FrmCtlSubReportDemo_Load事件里添加了一个对子报表事件的处理:reportViewer1.LocalReport.SubreportProcessing += newSubreportProcessingEventHandler(LocalReport_SubreportProces
26、sing);6) 关于子报表参数如何传递,在RDLC报表参数介绍一文中介绍;7) 运行效果如如下图所示5、 RDLC参数介绍5.1 报表参数处理1) 修改上文提高的ctlTableDemo.rdlc报表为例,该报表用于显示产品每季度的销售额。修改该报表,给该报表添加一个参数prod_cat,用于过滤只显示产品系统为参数prod_cat值对应的产品季度销售额。2) 在ctlTableDemo.rdlc设计器中,选择【报表】菜单,【报表参数】菜单,在报表参数界面中,添加一个报表参数取名为“prod_cat_sub,类型为String,提示信息为“输入产品系列名称,允许空白值;3) 选中table1
27、控件,鼠标右击,选择【属性】,选中【筛选器】Tab页,在筛选器列表中添加: = ;4) 在FrmCtlTableDemo窗体中添加下述代码,用红色表示的2行代码:privatevoid FrmCtlTableDemo_Load(object sender, EventArgs e) this.reportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local;this.reportViewer1.LocalReport.ReportPath = rdlcctlTableDemo.rdlc;/ repo
28、rtViewer1.LocalReport.DataSources.Add(newReportDataSource(ctlsDemo_vSales, LoadData();/ ReportParameter p = new ReportParameter(prod_cat_sub, ponent); reportViewer1.LocalReport.SetParameters(new ReportParameter p );/this.reportViewer1.RefreshReport(); 5) 运行结果如如下图所示,显示ponent产品系列的产品季度销售额;5.2 子报表参数处理1)
29、 在程序里面,本人还未找到直接向子报表传递参数的方法,但是可以用其它的方法变通实现,在主报表的subreport控件属性里面设置参数,通过主报表传递过去。2) 以上文提到的FrmSubReportDemo为例,其主报表为,先设置主报表的参数。在报表设计器中选择【报表】,【报表参数】,在报表参数对话框中,增加一个参数。参数名称为prod_cat,参数类型为String,参数提示为“输入产品系列名称。3) 选中子报表subreport1,鼠标右击,选择【属性】,选择【参数】tab页,添加一个参数。参数名称为“prod_cat_sub,参数值。为此,主报表的参数名与子报表的参数名称要不一致。4) 打
30、开subreport1对应的子报表设计器,本文为ctlTableDemo.rdlc,该ctlTableDemo.rdlc的参数在上文中已经设置,这里不再赘述。5) 运行效果如如下图所示。6、 RDLC钻取功能实现本Demo在主报表会显示一个部门列表部门ID、部门名称等,然后通过钻取功能可实现特定部门的员工信息展示,下述为具体操作步骤。1) 准备好两个数据源,本文为2个xml文件和,这两个文件放在项目的Data文件夹下,特别注意的是这两个文件的【复制到输出目录】属性要选择“始终复制,负责工程编译的时候不会将这两个文件生成到bin目录下。2) 新建报表,命名为“;新建一个数据集,命名为“depar
31、tments,在该数据集中添加一个Datatable,表结构如下:DepartmentIDInt32NameStringGroupNameStringModifiedDateDateTimerowguidString3) 在设计器中,拖入一个文本框和一个Table控件。文本框显示内容为“Drill Through Demo,在Table控件中拖入DepartmentID和Name两列。4) 添加Name列的导航、钻取功能。右击Name文本框,选择【属性】,选择【导航】Tab页,在“超级处选择“跳至报表该报表为显示钻取实现的目标报表,假设为drillthroughDetail.rdlc,且已经存
32、在,因此在实践时,可以再本操作之前,先创建一个drillthroughDetail.rdlc报表,设置“跳至报表为drillthroughDetail,点击【参数】按钮,会弹出参数设置对话框。在对话框中,添加一个参数,名称为DepartmentID,值为;5) 设计drillthroughDetail.rdlc报表,先新建一个该报表对应的数据集,名称为employees,添加一个DataTable,名称为employee,employee表局部内容如下: 1 Terri 1 1 Duffy Lee false 245797967 VP Engineering 1998-03-03T00:00:
33、00.0000000-08:00 1961-09-01T00:00:00.0000000-07:00 adventure-worksTerri Terriadventure-works. 1 S Tad Orman 586-883-8338 true F 300 2 63.4615 1 20 false true 2003-01-15T19:26:13.9000000-08:00 1b76e019-0d60-4d48-b405-c9144fb9b3ab 从表的内容中,我们可以大致判断出其结构是什么样的啦。6) 拖入一个文本框控件和表格控件到drillthroughDetail.rdlc报表设计
34、器中,并从employees数据集中拖入相应字段到表格控件中,设置完毕之后,效果如如下图所示。7) 设置drillthroughDetail.rdlc报表的参数:参数名称为DepartmentID,类型为Integer;8) 设置drillthroughDetail.rdlc报表表格控件的筛选器,表达式为=CInt(),运算符为=,值为。9) 新建一个窗体FrmDrillThrough,添加一个ReportViewer控件,在代码编辑窗口,添加下述代码:privatevoid FrmDrillThrough_Load(object sender, EventArgs e) reportView
35、er1.ProcessingMode = ProcessingMode.Local; reportViewer1.LocalReport.ReportPath = Rdlc/drillthrough.rdlc; reportViewer1.LocalReport.DataSources.Add(newReportDataSource(departments_department, LoadData(Datadepartments.xml); reportViewer1.RefreshReport(); /读取XML数据privateDataTable LoadData(string xmlFi
36、lePath) DataSet dataSet = newDataSet(); dataSet.ReadXml(xmlFilePath);return dataSet.Tables0; private void reportViewer1_Drillthrough(object sender, DrillthroughEventArgs e) LocalReport localReport = (LocalReport)e.Report; localReport.DataSources.Add(new ReportDataSource(employees_employee, LoadData(
37、DataEmployees.xml);10) 运行效果如如下图所示。鼠标移到Name一列,会变成手的形状,如单击Engineering,就会钻取取来Engineering部门的员工信息,如如下图所示。7、 RDLC自定义工具条1) 自定义工具条可以理解为对ReportViewer的ToolBar功能的一种变通实现,如添加代码实现ToolBar刷新按钮的功能、ToolBar页导航功能。如刷新功能代码实现为:this.rptViewer.RefreshReport();如ToolBar停止按钮的代码实现为:this.rptViewer.CancelRendering(0);。2) 在做项目的时候,
38、如果用ReportViewer控件做报表展示工具的话,打印和导出的代码实现,应该要掌握。导出功能:ReportViewer导出都是通过Render来实现的,如下代码为导出Excel Microsoft.Reporting.WinForms.Warning Warnings;string strStreamIds;string strMimeType;string strEncoding;string strFileNameExtension;/this.rptViewer.LocalReport.Render(byte bytes = this.rptViewer.LocalReport.Re
39、nder(Excel, null, out strMimeType, out strEncoding, out strFileNameExtension, out strStreamIds, out Warnings);string strFilePath = D:exportdemo.xls;using (System.IO.FileStream fs = newFileStream(strFilePath, FileMode.Create) fs.Write(bytes, 0, bytes.Length);打印功能实现包括自定义打印,网上有很多这方面的例子,其中比拟完整,比拟有参考价值的是
40、蜡人X的博客,尤其是该博文提到的例子,大家一定要好好学习、分析。但是,蜡人X给出的RDLCPrint.rarDEMO中,打印也是一个间接行为,有点类似ReportViewer控件需要通过点击打印按钮来打印一样,并没有提供直接的打印函数,为此本人封装了打印功能(在附件的whhrdlc.dll文件中)并开放了打印函数,用户可以调用下面语句打印报表:/打印出错时,错误信息描述String errMsg = String.Emptys;/调用打印函数(弹出打印设置对话框)返回false打印失败;bool bln = Printer.PrintDialog(this.reportViewer1.Loca
41、lReport, out errMsg);/调用打印函数(直接打印)返回false打印失败;bool bln = Printer.Print (this.reportViewer1.LocalReport, out errMsg);8、 设计器实现8.1 RDLC XML分析1) RDLC文件其实就是一个XML文件,有很多结点和元素,在解决方案资源管理器中选中某个rdlc文件,鼠标右击,选择【打开方式】,在打开方式对话框中选择XML编辑器,单击确定按钮即可。在xml文件中我们可以看到DataSources、PageHeader、DataSets、ReportItems等结点,网上有篇Vs2005报表设计器XML分析总结的博文,写的比拟详细,大家可以参考。2) 这里比拟关键的就是DataSet的处理,Rdlc报表无论是表格显示还是矩阵显示或者列表显示数据,都需要关联DataSet。在前面提到的所有篇幅中,都是先创建一个数据集,并为该数据集添加一个DataTable,然后将表字段拖放到表格控件、矩阵控件或者列表控件,用以显示数据。这么做,从效率上来看不是最高的,因为手工产生一个目标DataTable比拟耗时。为此,我们可以先直接编辑rdlc的xml文件,编辑器dataset的内容即可,如下所示: ProdCat SubCat