本文实现简单的子报表
一、效果图
二、步骤
1.项目下新添加报表SubReport.rdlc,在主报表中添加子报表:右键=》插入=》子报表
2.(可选)传参给子报表
a.在主报表的子报表控件上设置参数
b.在子报表上添加参数
则子报表即可使用该参数
3.为子报表添加数据
添加SubDataSet.xsd,新建表,添加字段address、字段zipcode
在子报表中,指定数据集,并设计界面
添加后台代码(全部代码)
using Microsoft.Reporting.WinForms; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace RdlcDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //为子报表添加事件 this.reportViewer1.LocalReport.SubreportProcessing += new Microsoft.Reporting.WinForms.SubreportProcessingEventHandler(SubReportProcessingEventHandler); //自定义数据源 DataTable dt = GetData(); //自定义参数 List<ReportParameter> list = new List<ReportParameter>(); ReportParameter rp = new ReportParameter("pid", "11"); list.Add(rp); this.reportViewer1.LocalReport.ReportPath = Application.StartupPath + "\\Report1.rdlc"; this.reportViewer1.LocalReport.DataSources.Clear(); this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", dt));//指定数据源 this.reportViewer1.LocalReport.SetParameters(list); //参数设置 this.reportViewer1.RefreshReport(); } private void SubReportProcessingEventHandler(object sender, SubreportProcessingEventArgs e) { //为子报表统计数据 e.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", GetSubData())); } /// <summary> /// 获取主表数据 /// </summary> /// <returns></returns> DataTable GetData() { DataTable dt = new DataTable(); dt.Columns.Add("id", typeof(int)); dt.Columns.Add("name", typeof(string)); DataRow dr = null; dr = dt.NewRow(); dr[0] = 1; dr[1] = "li"; dt.Rows.Add(dr); return dt; } /// <summary> /// 获取子表数据 /// </summary> /// <returns></returns> DataTable GetSubData() { DataTable dt = new DataTable(); dt.Columns.Add("address", typeof(string)); dt.Columns.Add("zipcode", typeof(string)); DataRow dr = null; dr = dt.NewRow(); dr[0] = "福建省厦门市"; dr[1] = "361000"; dt.Rows.Add(dr); return dt; } } }
思路拓展:
1.标签打印
场景:需要批量打印标签(标签需定义特定格式),每标签为每行数据的几个属性
解决方案:
在主报表的table使用子报表,传递参数到子报表;
在主报表进行分组,即根据唯一属性分组(为了实现每页只显示一个子报表)