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

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

 

posted @ 2015-05-15 16:17  心存善念  阅读(1531)  评论(0编辑  收藏  举报