本文只代表作者在一定阶段的认识与理解
一. 写作前提
前两篇我们讲到了如何在RDLC中如何插入和使用图片,除了图片以外,在报表中我们往往需要使用一些特定格式或在特定的条件下使用特定的数据,或对数据做下些处理,并且可能存在一些数据是要我们从ASP.NET程序提供的,所以这篇我们主要讲RDLC报表中如何使用参数、表达式及常用常量。
由于最近项目比较紧,没有时间写过多复杂的东西,而群里的兄弟又比较想知道页首页尾及合并表头的设计,所以我把一个完事的设计模板放在ReportTemplate文件夹中,提供给大家参考。
本篇讲的基础是([原创] RDLC 报表系列(一) 创建一个报表)的基础上来讲的,如果没有看过,这里就不在叙述前面的内容。
二. 本文内容
1. 怎样通过ASP.NET 程序为RDLC报表提供参数
2. 怎样使用RDLC提供的变量及常用常量
3. 常用表达式的使用
4. 总结
5. 代码下载(下载)
三. ASP.NET 程序为RDLC报表提供参数
在我们的报表中,往往需要从ASP.NET程序提供一些参数显示在报表的指定位置,第一篇中我们已经讲过怎样传递一个数据集,但是我们只需要一个值,总不能把这个值放到DataSet中来传输吧(因为DataSet本其实是由XML结成,在传递过程中需要比data本身更多的资源),所以这个时候我们就需要知道如何传递一个参数到RDLC报表。下面我们就来讲一讲。
不知道大家还记不记得我在第一篇中的Default.aspx.cs中写的一个Button事件,如下。
2 {
3 List<ReportDataSource> reportDataSource = new List<ReportDataSource>();
4 RportDataSet ds = new RportDataSet();
5 string templatePath = string.Empty;
6 string totalRecords = string.Empty;
7
8 SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LoggingConnectionString"].ConnectionString);
9 SqlCommand command = conn.CreateCommand();
10 command.CommandType = CommandType.Text;
11 command.CommandText = "SELECT * FROM T_BC_LOGS";
12 SqlDataAdapter da = new SqlDataAdapter(command);
13 da.Fill(ds.T_BC_LOGS);
14 reportDataSource.Add(new ReportDataSource("RportDataSet_T_BC_LOGS", ds.T_BC_LOGS));
15
16 //TemplateFiles
17 templatePath = "ReportTemplate/LogReport.rdlc";
18 List<ReportParameter> parameterList = new List<ReportParameter>();
19 ////Generate Report
20 GetReportMultipleDataSourceFile(reportDataSource, templatePath, parameterList, "pdf");
21 }
其中我定义了一个泛型变量,如下:
List<ReportParameter> parameterList = new List<ReportParameter>();
但是我并没有给这个变量赋任何值,我要告诉大家的就是这里变量就是为我们传递参数提供的。好,下面我们就来讲一下怎么传递这个参数。
1. 首先我们打开ReportTemplate文件夹中的RDLC报表模板,点击报表的编辑区,然后打开Report菜单下的Report Parameters…,在Report Parameters窗口中,我们点击Add 按钮,接着我们输入这个参数的名称与类型(这个名称你要记住,因为下面的编程中要用到),如果这个参数提供的时候不一定每次都有值,那么我们则要选中All null value的复选框,如下图所示,如果你有多个参数则以此方法添加即可。
2. 我们从Visual Studio IDE左边的ToolBox中拖一个TextBox到这个报表模板的页首(在我的报表中,复杂的表头大部分都是通过TextBox来实现的,可以设计TextBox的边框及字体等属性来设计,所以后面的内容中我不会再提如何设计复杂的报表页首),右击这个TextBox,选择Expression…,在Expression窗口中,我们选择Category中的Parameters,然后双击最右边你刚刚加的那个参数,点击确定即可。至此,对报表的设计完成了。
3. 修改Default.aspx页面中的程序如下所示:
2 {
3 List<ReportDataSource> reportDataSource = new List<ReportDataSource>();
4 RportDataSet ds = new RportDataSet();
5 string templatePath = string.Empty;
6 string totalRecords = string.Empty;
7
8 SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LoggingConnectionString"].ConnectionString);
9 SqlCommand command = conn.CreateCommand();
10 command.CommandType = CommandType.Text;
11 command.CommandText = "SELECT * FROM T_BC_LOGS";
12 SqlDataAdapter da = new SqlDataAdapter(command);
13 da.Fill(ds.T_BC_LOGS);
14 reportDataSource.Add(new ReportDataSource("RportDataSet_T_BC_LOGS", ds.T_BC_LOGS));
15
16 //TemplateFiles
17 templatePath = "ReportTemplate/LogReport.rdlc";
18 List<ReportParameter> parameterList = new List<ReportParameter>();
19 //为参数Parameter1传递This is a parameter
20 parameterList.Add(new ReportParameter("Parameter1", "This is a parameter"));
21 ////Generate Report
22 GetReportMultipleDataSourceFile(reportDataSource, templatePath, parameterList, "pdf");
23 }
运行结果如图所示:
四. 使用RDLC提供的变量及常用常量
在RDLC报表中,有些你想得到的功能是用ASP.NET代码完成不了的,比如说这个报表总共有多少页,当前在第几页等等,这些功能我们就要借助RDLC表达式中自带的一些常量了,下面就让我们来谈谈这此常量。
1. 显示总共页数及当前页
a) 从Visual Studio IDE左边的ToolBox中拖两个TextBox到报表的页首。
b) 右击第一个TextBox,选择Expression…,在Expression窗口的Category中选择Globals,然后在Item中双击选择TotalPages,这个变量就是总共多少页,为了方便我们查看,我们把在上面显示的表达式进行修改如下:
="Total of "+Globals!TotalPages.ToString()
c) 按上面的加入总页的方式,右击第二个TextBox选择Expression…,然后在选择Globals,接着选择PageNumber,这就是当前的页数,同样为了方便查看,修改如下:
=" Total of "+Globals!PageNumber.ToString()
注意:
刚才我们选择总页数和当前页数的时候,是不是发现除了这两个还有好几个常量,现在解释如下:
ExecutionTime |
生成报表的时间 |
PageNumber |
当前的页号 |
ReportFolder |
包含报表的文件路径 |
ReportName |
报表的名称 |
ReportServerUrl |
执行报表Server的路径(这里没有用Server,所以没有,如果用ReportService那就就存在了) |
TotalPages |
总行数 |
UserID |
当前执行报表的人 |
Language |
执行报表Server的系统语言 |
2. 为RDLC报表中数据行增加自动编号
a) 为了完成这个功能,我们完成这个功能,现在我们为报表中已经存在的Talbe在最左边加一个字段叫S/N(这篇中没有讲表从哪里来,请参阅[原创] RDLC 报表系列(一) 创建一个报表)。
b) 还记得我当时给这个表绑定了一个数据集吗?选点右击表,选择Properties,从里面拷出那个数据集的名称。
c) 右击S/N的数据字段,选择Expression,在Expression的Category中选择Common FunctionsàMiscellaneous,然后双击右边Item中的RowNumber,在其参数中输入数据集的名称,如下所示:
=RowNumber("RportDataSet_T_BC_LOGS")
五. 常用表达式的使用
1. 连接字符
=Fields!FirstName.Value + Fields!LastName.Value 连接两个字段在一个单元格中,并一行显示
=Fields!FirstName.Value & vbCrLf & Fields!LastName.Value 连接两个字段在一个单元格中显示,但是换行显示
更新(6 April 2010):
我今天做项目的时候遇到下面的问题,下面的这行代码编译不过。
=First(Fields!SingaporeAddress.Value, "SP_STUDENT_DETAILSResult") & vbCrLf & First(Fields!SingaporeAddress2.Value, "SP_STUDENT_DETAILSResult")
原因是因为:First(Fields!SingaporeAddress.Value, "SP_STUDENT_DETAILSResult") 生成的是一个Ojbect,而& vbCrLf &是连接一个字符串的,所以我们需要把他们进行转换,如下
=First(Fields!SingaporeAddress.Value,
"SP_STUDENT_DETAILSResult").ToString() & vbCrLf & First(Fields!SingaporeAddress2.Value, "SP_STUDENT_DETAILSResult").ToString()
2. If表达式使用
=IIF(Fields!LineTotal.Value > 100, True, False) 如果成立执行True的表达式,否则执行False表达式,我可也可以写其它的表达式代替代码里的东西
3. Count表达式使用
=Count(Fields!DAILYCOUNT.Value,"WeldingReportDataSet_T_WelderDaily") 计算WeldingReportDataSet_T_WelderDaily数据集中DAILYCOUNT有多少行
3. Sum表达式使用
=Sum(Fields!DAILYCOUNT.Value,"WeldingReportDataSet_T_WelderDaily") 计算WeldingReportDataSet_T_WelderDaily数据集中DAILYCOUNT的总和
4. Format表达式使用
=CDate(Fields!TOPAINTDATE.Value).ToString("dd MMM yyyy") 对date的格式进行应用
关于表达式实在太多了,也不一一列举了,可以参考
http://www.cnblogs.com/hubcarl/archive/2009/10/08/1579029.html