制表日期:2011 年 08 月 01 日
制表人:潘梦军
RDLC 使用总结
1、为什么要使用 RDLC 报表(简介)
VS .NET 开发中,用什么进行报表设计?可能的回答是 Crystal Report,当然,必须承认
Crystal Report 的功能还是非常强大的,被 Business Object 收购以后,商业的成分也在逐渐增
加,也形成了一定规模的用户群。
Visual Studio .NET 进入 2005 版本以后,Crystal Report 与 IDE 的结合更“紧密”了,至少
我们看不到那个讨厌的注册窗口了。但是,Microsoft 似乎并不容忍在自己的超级工具中竟然
没有报表工具,于是 Report Viewer Control 出现了,我把它的报表称为 RDLC 报表。
在 VS .NET 2005 之前,SQL Server Reporting Services 中已经提供了一种被称为报表定义语
言(Report Definition Language, RDL)的语言;在 VS .NET 2005 中,Microsoft 提供了针对这
种报表的设计器,并提供了在 WinForm 和 WebForm 中使用这种报表的能力。Microsoft 将这
种报表的后缀定为 RDLC,RDL 仍然是 Report Definition Language 的缩写,那么 C 代表什么
呢?C 代表 Client-side processing,凸显了它的客户端处理能力。
这种报表的易用性和可定制性让我们完全有理由放弃 Crystal Report,让我们来看看它的强
大功能吧:
1) 简单易用的控件,特别是 Table 控件,非常方便字段在报表上的排列;
2) 灵活的可定制性,用 XML 来描述一个报表相关的一切,不用说了吧;
3) 高度可编程性,在你的项目中,甚至不需要有一个报表文件,通过代码就可以实现报
表生成、预览和打印等一系列操作;
4) 支持 DrillThrough 数据钻取功能;
5) 导出的 Excel 文件格式非常完美,而且并不需要安装 Excel;
6) 数据源处理极其方便,开发人员可以自己接管数据库连接、取数,然后将数据结果赋
值给 RDLC 的数据集即可。
7) 展示和数据分离,程序员更是可以编写一个 RDLC 设计器交有用户使用,这样用户
就可以自行设计 RDLC 报表格式,程序员只负责定制数据接口即可。
RDLC MSDN:http://msdn.microsoft.com/zh-cn/library/ms251671(VS.80).aspx
2、RDLC 简单 Demo
本文所有 RDLC 例子都是基于 VS2005 C#,所有 ReportViewer 的处理模式都是 Local 模式。
本报表 Demo 显示上文中提到的 RDLC 手册各节内容,下述为 Demo 的详细 steps。
1) 新建项目,选择 Windows 应用程序项目类型,输入工程名称 RDLCDev;
2) 修改 Form1 窗体名称为 FrmRdlcUserGuide,在工具箱—>数据 Tab 选项卡中选择
ReportViewer 控 件 , 将 其 拖 入 到 FrmRdlcUserGuide , 默 认 命 名 为 reportViewer1 , 调 整
ReportViewer 控件的大小和布局;
3) 在解决方案资源管理器中选择 RDLCDev 工程,鼠标右击 RDLCDev 工程,添加新建
地址:广东省中山市石岐区东明路 23 号
TEL(0760)-8713353
FAX(0760)-8713354
1/46
制表日期:2011 年 08 月 01 日
制表人:潘梦军
项,在添加新项模板中选择“报表”,取名为 rdlcuserguide.rdlc,单击添加按钮,然后在解决
方案资源管理器中RDLCDev 工程下会增加一个rdlcuderguide.rdlc 文件,并且会自动打开RDLC
设计器;
4) 在 RDLC 设计器中添加 11 个 TextBox 控件,1 个作为标题,其余 10 个作为 RDLC
使 用 手 册 具 体 内 容 , 对 每 个 TextBox 控 件 进 行 TextAlign 、Color 、BorderStyle 、Font 和
TextDecoration 等相关属性设置,设计完毕之后,大致如下图所示。
5) 在 FrmRdlcUserGuide 窗体 Load 事件中添加下述代码
private void 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 工程,运行结果大致如下图所示。
地址:广东省中山市石岐区东明路 23 号
TEL(0760)-8713353
FAX(0760)-8713354
2/46
制表日期:2011 年 08 月 01 日
制表人:潘梦军
3、RDLC 常用控件介绍
RDLC 设计工具箱上总共有 9 种控件:文本框(TextBox)、折线(Line)、表(Table)、矩阵
(Matrix)、矩形(Rectangle)、列表(List)、子报表(SubReport)、图表控件(Chart)、图像控件(Image)。
下图 ctlsDemo.rdlc 设计器所示为所有控件的设计演示。
地址:广东省中山市石岐区东明路 23 号
TEL(0760)-8713353
FAX(0760)-8713354
3/46
制表日期:2011 年 08 月 01 日
制表人:潘梦军
1) 由于表格控件、矩阵控件、列表控件和图表控件必须填充数据集,因此把所有控件布
局完毕之后,创建一个数据集。解决方案资源管理器中,选中 RDLCDev 工程,右击添加新建
项,在新建项类型模板里选择“数据集”,取名“ctlsDemo.xsd”,单击“添加”。
ctlsDemo.xsd 添加完毕之后,在解决方案资源管理器中会增加一个 ctlsDemo.xsd 文件,并
前 VS IDE 会自动打开 ctlsDemo.xsd 设计页面。在设计页面中右击,添加 Datatable,将其命名
为 vSales,该表描述的是产品的销售额信息,为 vSales 表添加列,列信息如下:
ProdCat
SubCat
OrderYear
OrderQtr
Sales
System.String
System.String
System.Int32
System.String
System.Double
2) 文本框控件、折线控件、矩形控件使用相对简单,这里不细说;
3) Image 控件,现在 RDLC 设计器模式下,选择“报表”菜单,“嵌入图像”,在“嵌
入图像”对话框中,载入一个本地图像文件即可。然后设置 Image 控件的 Source 属性为
Embedded,设置 Value 属性为刚才处理的嵌入图像即可。当然还有别的方式可以显示图像,
大家可以 Google 一下,关键字为 RDLC、嵌入图像;
4) 图表控件,使用图表控件的一个关键是要设置好图表属性页面中的数据 TAB 页相关
内容。主要有值、类别组和序列组定义,大家可以参考 Demo;
5) 表格控件、矩阵控件和子报表控件,在后续内容中会详细介绍;
4.1 表格控件使用介绍
1) Table 控件是 RDLC 报表显示数据的一个核心控件,关于 Table 控件,在微软提供的
地址:广东省中山市石岐区东明路 23 号
TEL(0760)-8713353
FAX(0760)-8713354
4/46
制表日期:2011 年 08 月 01 日
制表人:潘梦军
RDLC 规范里有详细的介绍,其大致内容可以用下述的一张类 UML 图来表示;
2) 新建报表文件,命名为 ctlTableDemo.rdlc;
3) 在 ctlTableDemo.rdlc 设计器中,拖入 Table 控件,默认情况下是 3 行 3 列,其中第 1
行为表头行(我们理解为列标题行),第二行为详细信息行(我们理解为报表内容展示区域),
第三行为表尾行(我们理解为汇总区域)。可以整行选中,然后右击鼠标添加行或者删除行,
也可以整列选中,然后右击鼠标添加或者删除列。上文中提到的数据集合有 5 个字段,因此需
要 5 列来显示,为此需要增加两列。
4) 在数据源窗口中(如果没有显示的话,选择【数据】菜单下的【显示数据源】即可)
选择上文中创建的 ctlsDemo.xsd 数据集,将 ProdCat、SubCat、OrderYear 、OrderQtr 和 Sales
分别拖入到 Table 控件的详细信息行的不同列中去。
5) 设置标题行文字显示都居中,Sales 的内容显示右对齐,ProdCat、SubCat、OrderYear、
OrderQtr 和 Sales 文本框的字体颜色全部设置成 Blue,Sales 文本框由于显示的内容为销售额,
因此需设置数字显示格式,小数位数。鼠标右击 Sales 文本框,选择【属性】,在文本框属性
窗口中,选择格式 Tab 页,在格式代码处,选择数字 1,234.00 格式即可,选择完毕之后该文
本框的数字就以逗号千分位作为分割符,保留 2 位小数显示,效果如下图所示。
地址:广东省中山市石岐区东明路 23 号
TEL(0760)-8713353
FAX(0760)-8713354
5/46
制表日期:2011 年 08 月 01 日
制表人:潘梦军
6) 插入一个组实现分组统计功能。选中整行,鼠标右击,选择【插入组】,弹出分组和
排序属性对话框,设置分组名称、分组方式、是否显示组头或者组尾等属性即可,本文分组设
置如下:
·分组名称:table1_Group1
·分组表达式:=Fields!ProdCat.Value;=Fields!SubCat.Value;=Fields!OrderYear.Value,实现
产品年度销售额汇总统计功能。
·不显示组头、显示组尾(至于组头、组尾是个什么样的东西,大家只要动手试一下就一目
了然了)
·在 textbox15 中输入汉字“合计”,在 textbox16 文本框中输入合计表达式
=Sum(CDbl(Fields!Sales.Value)),设置完之后效果如下图所示。
7) 新建窗体 FrmCtlTableDemo,然后在该窗体上添加 ReportViewer 控件,在窗体 FrmCtlTableDemo 代码窗口里
输入以下代码:
private void FrmCtlTableDemo_Load(object sender, EventArgs e)
{
this.reportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local;
this.reportViewer1.LocalReport.ReportPath = @"rdlc\ctlTableDemo.rdlc";
//
reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("ctlsDemo_vSales", LoadData()));
//
地址:广东省中山市石岐区东明路 23 号
TEL(0760)-8713353
FAX(0760)-8713354
6/46
制表日期:2011 年 08 月 01 日
制表人:潘梦军
this.reportViewer1.RefreshReport();
}
private DataTable LoadData()
{
}
DataSet dataSet = new DataSet();
dataSet.ReadXml(@"data\ctlsDemo.xml");
return dataSet.Tables[0];
8) 运行效果如下图所示
4.2 矩阵控件使用介绍
1) 矩阵控件主要用于显示 CrossTable 之类的报表,因此其列数可以是 Static 的,也可以
是 Dynamic 并且 Can grow 的,关于矩阵控件,在 RDLC 协议规范里也有介绍,其大致内容可
以用下图表示。
地址:广东省中山市石岐区东明路 23 号
TEL(0760)-8713353
FAX(0760)-8713354
7/46
制表日期:2011 年 08 月 01 日
制表人:潘梦军
2) 新建报表文件,命名为 ctlMatrixDemo.rdlc;
3) 在 ctlMatrixDemo.rdlc 设计器中,拖入 Matrix 控件,默认情况下是 2 行 2 列,左上角
单元格为空白区域(通常用来显示报表摘要信息如产品/年度等),右上单元格显示为“列”,
单击此处可以增加列分组,左下单元格显示为“行”,单击此处可以添加行分组,右下单元格
显示为“数据”,单击此处可以添加静态行、静态列。
4) 在矩阵左上角单元格空白区域拖入矩形控件,然后在该矩形控件中拖入一个折线控件
和两个文本框控件,折线当做矩形的对角线,两个文本框内容为产品和年度分布在折线两侧。
5) 增 加 两 个 行 分 组 , 分 别 为 matrix1_RowGroup1 和 matrix1_RowGroup2 ,
matrix1_RowGroup1 的 表 达 式 为 =Fields!ProdCat.Value , matrix1_RowGroup2 的 表 达 式 为
=Fields!SubCat.Value。
6) 增 加 两 个 列 分 组 , 分 别 为 matrix1_ColumnGroup1 何 matrix1_ColumnGroup2 ,
matrix1_ColumnGroup1 的表达式为=Fields!OrderYear.Value,matrix1_ColumnGroup2 的表达式
为=Fields!OrderQtr.Value。
7) 在“数据”单元格中编辑表达式=Sum(CDbl(Fields!Sales.Value))
8) 设计完之后,效果如下图所示;
地址:广东省中山市石岐区东明路 23 号
TEL(0760)-8713353
FAX(0760)-8713354
8/46