收藏 分享(赏)

RDLC报表分组.docx

上传人:yjrm16270 文档编号:6784319 上传时间:2019-04-22 格式:DOCX 页数:29 大小:1.07MB
下载 相关 举报
RDLC报表分组.docx_第1页
第1页 / 共29页
RDLC报表分组.docx_第2页
第2页 / 共29页
RDLC报表分组.docx_第3页
第3页 / 共29页
RDLC报表分组.docx_第4页
第4页 / 共29页
RDLC报表分组.docx_第5页
第5页 / 共29页
点击查看更多>>
资源描述

1、原创 RDLC 报表系列(三) 参数、常量及常用表达式的使用 本文只代表作者在一定阶段的认识与理解一 写作前提前两篇我们讲到了如何在 RDLC 中如何插入和使用图片,除了图片以外,在报表中我们往往需要使用一些特定格式或在特定的条件下使用特定的数据,或对数据做下些处理,并且可能存在一些数据是要我们从 ASP.NET 程序提供的,所以这篇我们主要讲 RDLC 报表中如何使用参数、表达式及常用常量。由于最近项目比较紧,没有时间写过多复杂的东西,而群里的兄弟又比较想知道页首页尾及合并表头的设计,所以我把一个完事的设计模板放在 ReportTemplate 文件夹中,提供给大家参考。本篇讲的基础是( 原

2、创 RDLC 报表系列(一) 创建一个报表)的基础上来讲的,如果没有看过,这里就不在叙述前面的内容。二 本文内容 1. 怎样通过 ASP.NET 程序为 RDLC 报表提供参数2. 怎样使用 RDLC 提供的变量及常用常量3. 常用表达式的使用4. 总结5. 代码下载(下载)三 ASP.NET 程序为 RDLC 报表提供参数 在我们的报表中,往往需要从 ASP.NET 程序提供一些参数显示在报表的指定位置,第一篇中我们已经讲过怎样传递一个数据集,但是我们只需要一个值,总不能把这个值放到 DataSet 中来传输吧(因为 DataSet 本其实是由 XML 结成,在传递过程中需要比data 本身

3、更多的资源) ,所以这个时候我们就需要知道如何传递一个参数到 RDLC 报表。下面我们就来讲一讲。不知道大家还记不记得我在第一篇中的 Default.aspx.cs 中写的一个 Button 事件,如下。1 protected void ButtonReportGenerate_Click(object sender, EventArgs e)2 3 List reportDataSource = new List();4 RportDataSet ds = new RportDataSet();5 string templatePath = string.Empty;6 string tot

4、alRecords = 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 SqlDataAda

5、pter 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 /TemplateFiles17 templatePath = “ReportTemplate/LogReport.rdlc“;18 List parameterList = new List();19 /Generate Report20 GetReportMultipleDataSour

6、ceFile(reportDataSource, templatePath, parameterList, “pdf“);21 其中我定义了一个泛型变量,如下:List parameterList = new List();但是我并没有给这个变量赋任何值,我要告诉大家的就是这里变量就是为我们传递参数提供的。好,下面我们就来讲一下怎么传递这个参数。1. 首先我们打开 ReportTemplate 文件夹中的 RDLC 报表模板,点击报表的编辑区,然后打开 Report 菜单下的 Report Parameters,在 Report Parameters 窗口中,我们点击 Add 按钮,接着我们输

7、入这个参数的名称与类型(这个名称你要记住,因为下面的编程中要用到) ,如果这个参数提供的时候不一定每次都有值,那么我们则要选中 All null value 的复选框,如下图所示,如果你有多个参数则以此方法添加即可。2. 我们从 Visual Studio IDE 左边的 ToolBox 中拖一个 TextBox 到这个报表模板的页首(在我的报表中,复杂的表头大部分都是通过 TextBox 来实现的,可以设计 TextBox 的边框及字体等属性来设计,所以后面的内容中我不会再提如何设计复杂的报表页首) ,右击这个 TextBox,选择 Expression,在 Expression 窗口中,我

8、们选择 Category 中的Parameters,然后双击最右边你刚刚加的那个参数,点击确定即可。至此,对报表的设计完成了。3. 修改 Default.aspx 页面中的程序如下所示:1 protected void ButtonReportGenerate_Click(object sender, EventArgs e)2 3 List reportDataSource = new List();4 RportDataSet ds = new RportDataSet();5 string templatePath = string.Empty;6 string totalRecords

9、 = 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 =

10、 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 /TemplateFiles17 templatePath = “ReportTemplate/LogReport.rdlc“;18 List parameterList = new List();19 /为参数 Parameter1 传递 This is a parameter20 parameterLis

11、t.Add(new ReportParameter(“Parameter1“, “This is a parameter“);21 /Generate Report22 GetReportMultipleDataSourceFile(reportDataSource, templatePath, parameterList, “pdf“);23 运行结果如图所示:四 使用 RDLC 提供的变量及常用常量在 RDLC 报表中,有些你想得到的功能是用 ASP.NET 代码完成不了的,比如说这个报表总共有多少页,当前在第几页等等,这些功能我们就要借助 RDLC 表达式中自带的一些常量了,下面就让我们

12、来谈谈这此常量。1. 显示总共页数及当前页a) 从 Visual Studio IDE 左边的 ToolBox 中拖两个 TextBox 到报表的页首。b) 右击第一个 TextBox,选择 Expression,在 Expression 窗口的 Category 中选择Globals,然后在 Item 中双击选择 TotalPages,这个变量就是总共多少页,为了方便我们查看,我们把在上面显示的表达式进行修改如下:=“Total of “+Globals!TotalPages.ToString()c) 按上面的加入总页的方式,右击第二个 TextBox 选择 Expression,然后在选择

13、Globals,接着选择 PageNumber,这就是当前的页数,同样为了方便查看,修改如下:=“ Total of “+Globals!PageNumber.ToString()注意:刚才我们选择总页数和当前页数的时候,是不是发现除了这两个还有好几个常量,现在解释如下:ExecutionTime 生成报表的时间PageNumber 当前的页号ReportFolder 包含报表的文件路径ReportName 报表的名称ReportServerUrl 执行报表 Server 的路径(这里没有用 Server,所以没有,如果用 ReportService 那就就存在了)TotalPages 总行数

14、UserID 当前执行报表的人Language 执行报表 Server 的系统语言2. 为 RDLC 报表中数据行增加自动编号a) 为了完成这个功能,我们完成这个功能,现在我们为报表中已经存在的 Talbe 在最左边加一个字段叫 S/N(这篇中没有讲表从哪里来,请参阅 原创 RDLC 报表系列(一) 创建一个报表) 。b) 还记得我当时给这个表绑定了一个数据集吗?选点右击表,选择 Properties,从里面拷出那个数据集的名称。c) 右击 S/N 的数据字段,选择 Expression,在 Expression 的 Category 中选择 Common FunctionsMiscellan

15、eous,然后双击右边 Item 中的 RowNumber,在其参数中输入数据集的名称,如下所示:=RowNumber(“RportDataSet_T_BC_LOGS“)五 常用表达式的使用1. 连接字符=Fields!FirstName.Value + Fields!LastName.Value 连接两个字段在一个单元格中,并一行显示=Fields!FirstName.Value using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.We

16、b; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Data.SqlClient; using System.Collections.Generic; using System.Xml.Linq; using Microsoft.Reporting.WinForms; using RCLC.DataEnt

17、ity; namespace RCLC public partial class _Default : CustomPageBase protected void Page_Load(object sender, EventArgs e) protected void ButtonReportGenerate_Click(object sender, EventArgs e) List reportDataSource = new List(); RportDataSet ds = new RportDataSet(); string templatePath = string.Empty;

18、string totalRecords = string.Empty; 0212223242526272829303/获得数据 SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings“LoggingConnectionString“.ConnectionString); SqlCommand command = conn.CreateCommand(); command.CommandType = CommandType.Text; command.CommandText = “SELECT T

19、OP 200 * FROM T_STUDENT“; SqlDataAdapter da = new SqlDataAdapter(command); da.Fill(ds.T_STUDENT); /指定报表模板 templatePath = “ReportTemplate/StudentReport.rdlc“; /把获取的数据集合提供给在报表中名为 RportDataSet_T_STUDENT 数据集 reportDataSource.Add(new ReportDataSource(“RportDataSet_T_STUDENT“, ds.T_STUDENT); List paramete

20、rList = new List(); /Generate Report, 报表可以生成 PDF, EXCEL 及以其它形式,根据需求去设置 GetReportMultipleDataSourceFile(reportDataSource, templatePath, parameterList, “pdf“); 上面的代码已经获取到 200 条学生的信息,然后把数据从数据库中取出然后加载到StudentReport.rdlc 报表中,下面要做的事情就是对数据进行分组了。四、实现分组下面我们根据学生的性别进行分组,步骤如下: 打开 RDLC 模板文件,点击报表的行标签,然后点击“插入分组(In

21、sert Group)” 在插入分组的窗口中,我们选择需要分组字段(这里的学生的性别),如下图所示 插入分组后,我们可以为分组加一标题,标题就是性别 这样我们就已经分组结束了,下面我们要做的就是看看如果如何。】你也可以从这里下载 PDF 结果(下载)。五、总结通过上面的示例我们学会了如何使用 RDLC 分组功能实现功能,通过上面的示例我们插入了一个性别的分组,当然也可以分组中再插入子分组,以实现二级、三级或者 N 级分组。当然可以对分组进行统计等一系列功能。原创 RDLC 报表系列(四) 子报表的使用 amp;lt;pamp;gt;Your browser does not support i

22、frames.amp;lt;/pamp;gt; 本文只代表作者在一定阶段的认识与理解一写作前提前面几篇中我讲了如何去实现一个 RDLC 报表、插入图片、参数传递及常用表达式的使用。这一节我们将 focus on 子报表的使用。假设有一天,你的老板和你说,公司需要做所有员工的出出差记录,这时子报表的应用是一个不错的选择。关于怎样创建一个 RDLC 报表等相关内容,前查看我之前的文章,这里就不在阐述了。原创 RDLC 报表系列(一) 创建一个报表 原创 RDLC 报表系列(二) 报表中插入图片原创 RDLC 报表系列(三) 参数、常量及常用表达式的使用二 本文内容1. RDLC 报表模板的设计2.

23、 Base 的修改3. 调用生成报表 4. 总结5. 代码下载(下载)三RDLC 报表模板设计本篇要做的是一个含有子报表的报表,所以,最少我们需要两个报表模板,一个是Master.rdlc,另外一个是 Sub.rdlc。Ok,下面我们就来啰嗦一下怎么设计模板文件吧。1. 在 VS(本人用的是 2008 的 Version,自从小 2003 之后都支持.rdlc 报表)中创建一个新的 web application 项目。2. 新增两个新的报表文件,一个名叫 master.rdlc,一个名叫 sub.rdlc(在选择的时候要注意选择如下) 。3. 现在我们已经有报表模板文件了,再创建主报表和子报

24、表所需要使用的数据类型(所需要的 DataSet 类型,具体可参阅 原创 RDLC 报表系列(一) 创建一个报表),这里并不多做解释了。4. 打开 style=“mso-bidi-font-weight:bold“master.rdlc 文件,从工具箱中拖入一表格控件,设计你所需要的格式,选择所需要的数据源类型,然后在你需要使用子报表的地方从工具臬中插入一上 SubReport 控件,如下图所示。5. 然后右击这个 SubReport 控件,在属性中选择这个子报表指向哪个文件,我们可以选择刚才创建的那个 sub.rdlc 文件。其次是们还需要为主报表和子报表之关建立关连关系,在属性的 Para

25、meters(参数) 选择卡中新加我们需要传递给子报表的参数。在我的报表中用了一个参数如下,当然你也可以根据自己的的需要创建多个你需要传递给子报表的参数。6. 上面我们讲解完了主报表的设计,他制定了子报表以及子报表准获得的参数。现在打开 Sub.rdlc 文件,增加子报表所需要的数据源类型,并且创建参数,比如说我上面使用了一个 isoOid,所以在子报表中一定有一个参数名称和这个是相同的,他用来接收从主报表传来的筛选数据条件,即用这个参数从子报表中选择符合本记录的所有子记录集。7. 现在从工具箱中插入一个表格到你的子报表中(当然也可以不需要表格,根据需求定义的) ,然后右击属性选择所需要的数据

26、源类型,并且根据从 Master.rdlc 传过来的参数进行筛选,可以在属性窗口的 Filters(筛选)选项卡中加入筛选条件即可。8. 至此我们讲完了报表设计部分,下面我们就去看看,C#中是如何实现的。四Base 的修改因为是要用到报表,所以我们需要对子报表的生成事件进行订阅,因此我们把CustomPageBase 写成如下。1 public class CustomPageBase : Page2 3 List subDataSource = new List();4 public void GetReportMultipleDataSourceFile(List reportDateSo

27、urce, string TemplatePath, List parameterList, string FileType, List subDataList)5 6 string reportFormat = FileType;7 string outputfile = “Report.“; /报表名称8 ReportViewer rview = new ReportViewer();9 rview.ProcessingMode = ProcessingMode.Local;10 rview.LocalReport.ReportPath = Server.MapPath(TemplateP

28、ath);11 rview.LocalReport.DataSources.Clear();12 13 /为主报表加数据源14 foreach (ReportDataSource re in reportDateSource)15 16 if (subDataList.Contains(re.Name)17 18 subDataSource.Add(re);19 continue;20 21 rview.LocalReport.DataSources.Add(re);22 23 24 /设置 ReportViewer 进行事件订阅25 rview.LocalReport.SubreportPr

29、ocessing +=26 new SubreportProcessingEventHandler(SubreportProcessingEventHandler);27 28 if (parameterList.Count 0)29 rview.LocalReport.SetParameters(parameterList);30 string mimeType, encoding, extension, deviceInfo;31 string streamids;32 Warning warnings;33 deviceInfo = “ + “True“ + “;34 35 byte b

30、ytes = rview.LocalReport.Render(reportFormat, deviceInfo, out mimeType, out encoding, out extension, out streamids, out warnings);36 HttpContext.Current.Response.Buffer = true;37 HttpContext.Current.Response.Clear();38 HttpContext.Current.Response.ContentType = mimeType;39 HttpContext.Current.Respon

31、se.AddHeader(“Content-Disposition“,“attachment; filename=“ + outputfile + extension + “;“);40 HttpContext.Current.Response.BinaryWrite(bytes);41 HttpContext.Current.Response.End();42 43 44 / 45 / 为子报表加数据源46 / 47 / 48 / 49 void SubreportProcessingEventHandler(object sender, SubreportProcessingEventAr

32、gs e)50 51 foreach (var ReportDataSource in subDataSource)52 53 e.DataSources.Add(ReportDataSource);54 55 56 和这前的相关,GetReportMultipleDataSourceFile 这个文件多提供一了一个新的参数 subDataList 他是用来指定哪些数据源是给子报表的。五调用生成报表1 public partial class _Default : CustomPageBase2 3 protected void Page_Load(object sender, EventAr

33、gs e)4 5 6 7 8 / 9 / Generate the report10 / 11 / 12 / 13 protected void ButtonGenerate_Click(object sender, EventArgs e)14 15 List reportDataSource = new List();16 List subDataSource = new List();17 ReportDataSet ds = new ReportDataSet();18 string templatePath = string.Empty;19 20 SqlConnection con

34、n = new SqlConnection(ConfigurationManager.ConnectionStrings“PQMSConnectionString“.ConnectionString);21 SqlCommand comm = conn.CreateCommand();22 comm.CommandText = “select top 200 Oid, DrawingNumber, CWPNo,PaintCode, MasterRevision from ISO_DRAWING“;23 SqlDataAdapter da = new SqlDataAdapter(comm);2

35、4 da.Fill(ds, “ISO_DRAWING“); /获得主表的内容 (Get master table data)25 26 comm.CommandText = “SELECT S.Oid, S.ISOOid, S.SPOOLNo, S.Location, S.IssueNo, S.CP2 FROM SPOOL AS S INNER JOIN (SELECT TOP 200 OID FROM ISO_DRAWING) AS T ON S.ISOOID = T.OID“;27 da = new SqlDataAdapter(comm);28 da.Fill(ds, “SPOOL“);

36、29 30 reportDataSource.Add(new ReportDataSource(“ReportDataSet_ISO_DRAWING“, ds.ISO_DRAWING);31 reportDataSource.Add(new ReportDataSource(“ReportDataSet_SPOOL“, ds.SPOOL);32 subDataSource.Add(“ReportDataSet_SPOOL“);33 List parameterList = new List();34 35 templatePath = “Master.rdlc“;36 37 GetReport

37、MultipleDataSourceFile(reportDataSource, templatePath, parameterList, “PDF“, subDataSource);38 39 六总结通过上面的学习,我们了解如下内容:1. Sub Report Design2. Filter 的应用我现在有一组数据 A,把他们在 RDLC 上按照年龄分组, 1-20 岁是一组,20-40 岁是一组,40-60 岁是一组,60 岁以后是一组。报表表达式如下:=IIF(First(Fields!年龄.Value)=1,“少年“,(IIF(First(Fields!年龄.Value)=21 AND

38、 First(Fields!年龄.Value)=41 AND First(Fields!年龄.Value)=60,“中年“,“老年“)现在在报表分组中我想去掉最后一个“老年”分组,请问应该怎么办?求牛人。RDLC 使用手册_RDLC 常用控件介绍 2009-04-09 09:53 6533 人阅读 评论(3) 收藏 举报 RDLC 设计工具箱上总共有 9 种控件:文本框(TextBox)、折线(Line)、表(Table)、矩阵(Matrix)、矩形(Rectangle)、列表(List)、子报表(SubReport)、图表控件(Chart)、图像控件(Image)。下图 ctlsDemo.r

39、dlc 设计器所示为所有控件的设计演示。1) 由于表格控件、矩阵控件、列表控件和图表控件必须填充数据集,因此把所有控件布局完毕之后,创建一个数据集。解决方案资源管理器中,选中RDLCDev 工程,右击添加新建项,在新建项类型模板里选择“数据集”,取名“ctlsDemo.xsd”,单击“添加”。ctlsDemo.xsd 添加完毕之后,在解决方案资源管理器中会增加一个ctlsDemo.xsd 文件,并前 VS IDE 会自动打开 ctlsDemo.xsd 设计页面。在设计页面中右击,添加 Datatable,将其命名为 vSales,为 vSales 表添加列,列信息如下:ProdCat Syst

40、em.StringSubCat System.StringOrderYear System.Int32OrderQtr System.StringSales System.Double2) 文本框控件、折线控件、矩形控件使用相对简单,这里不细说;3) Image 控件,现在 RDLC 设计器模式下,选择“报表”菜单,“嵌入图像”,在“嵌入图像”对话框中,载入一个本地图像文件即可。然后设置Image 控件的 Source 属性为 Embedded,设置 Value 属性为刚才处理的嵌入图像即可。当然还有别的方式可以显示图像,大家可以 Google 一下,关键字为RDLC、嵌入图像;4) 图表控件

41、,使用图表控件的一个关键是要设置好图表属性页面中的数据 TAB 页相关内容。主要有值、类别组和序列组定义,大家可以参考 Demo;5) 表格控件、矩阵控件和子报表控件,在后续内容中会详细介绍;4.1 表格控件使用介绍1) Table 控件是 RDLC 报表显示数据的一个核心控件,关于 Table 控件,在微软提供的 RDLC 规范里有详细的介绍,其大致内容可以用下述的一张类UML 图来表示;2) 新建报表文件,命名为 ctlTableDemo.rdlc;3) 在 ctlTableDemo.rdlc 设计器中,拖入 Table 控件,默认情况下是 3 行3 列,其中第 1 行为表头行(我们理解为

42、列标题行),第二行为详细信息行(我们理解为报表内容展示区域),第三行为表尾行(我们理解为汇总区域)。可以整行选中,然后右击鼠标添加行或者删除行,也可以整列选中,然后右击鼠标添加或者删除列。上文中提到的数据集合有 5 个字段,因此需要 5 列来显示,为此需要增加两列。4) 在数据源窗口中(如果没有显示的话,选择【数据】菜单下的【显示数据源】即可)选择上文中创建的 ctlsDemo.xsd 数据集,将ProdCat、SubCat、OrderYear 、OrderQtr 和 Sales 分别拖入到 Table 控件的详细信息行的不同列中去。5) 设置标题行文字显示都居中,Sales 的内容显示右对齐

43、,ProdCat、SubCat、OrderYear、OrderQtr 和 Sales 文本框的字体颜色全部设置成Blue, Sales 文本框由于显示的内容为销售额,因此需设置数字显示格式,小数位数。鼠标右击 Sales 文本框,选择【属性】,在文本框属性窗口中,选择格式 Tab 页,在格式代码处,选择数字 1,234.00 格式即可,选择完毕之后该文本框的数字就以逗号千分位作为分割符,保留 2 位小数显示,效果如下图所示。6) 插入一个组实现分组统计功能。选中整行,鼠标右击,选择【插入组】,弹出分组和排序属性对话框,设置分组名称、分组方式、是否显示组头或者组尾等属性即可,本文分组设置如下:分

44、组名称:table1_Group1分组表达式:=Fields!ProdCat.Value;=Fields!SubCat.Value;=Fields!OrderYear.Value,实现产品年度销售额汇总统计功能。不显示组头、显示组尾(至于组头、组尾是个什么样的东西,大家只要动手试一下就一目了然了)在 textbox15 中输入汉字“合计”,在 textbox16 文本框中输入合计表达式=Sum(CDbl(Fields!Sales.Value),设置完之后效果如下图所示。7) 新建窗体 FrmCtlTableDemo,然后在该窗体上添加 ReportViewer 控件,在窗体FrmCtlTabl

45、eDemo 代码窗口里输入以下代码: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();/this.reportViewer1.RefreshReport();private DataTable LoadData()DataSet dataSet = new DataSet();dataSet.ReadXml(“data/ctlsDemo.xml“);return dataSet.Tables0;8) 运行效果如下图所示

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报