RDLC系列之二 子报表

本文实现简单的子报表

 一、效果图

 

二、步骤

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使用子报表,传递参数到子报表;

在主报表进行分组,即根据唯一属性分组(为了实现每页只显示一个子报表)

 

你可能感兴趣的:(报表)