zoukankan      html  css  js  c++  java
  • RDLC 主从报表筛选

    今天继续学习RDLC报表的“参数传递”及“主从报表”

    一、先创建DataSet,如下图:

    二、创建一个报表rptDEPT.rdlc,显示部门T_DPET的数据

    三、嵌入Default.aspx中,写在Default.aspx.cs中写些基本代码

    using System;
    using System.Data;
    using Microsoft.Reporting.WebForms;
     
    namespace ReportSample
    {
        public partial class Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    this.ReportViewer1.LocalReport.ReportPath = "rptDEPT.rdlc";
                    this.ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DS_DEPT", GetDeptData()));
                }
            }
     
     
            DataTable GetDeptData()
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("DEPTNO", typeof(string));
                dt.Columns.Add("DEPTNAME", typeof(string));
     
                dt.Rows.Add("01", "办公室");
                dt.Rows.Add("02", "技术部");
                dt.Rows.Add("03", "销售部");
                dt.Rows.Add("04", "客服部");
     
                return dt;                
            }
             
        }
    }

     运行效果:

    OK,下面才是真正开始:

    很多情况下(比如团队开发),报表的数据源DataTable通常是由其它人写好的,有些甚至不允许再做修改,报表开发人员只能被动的接收数据,但是报表上未必需要显示全部数据,以上面的报表为例,如果我们只需要显示"02技术部“的数据,如何处理?

    这时报表参数就派上用场了:

    四、添加报表参数

    在Report Data面板中,选中Parameters,右击-->Add Parameter

    为参数取名为DeptNo,并做一些设置,如下图

    五、为报表的Table添加Filters条件

    上一步添加的参数需要与报表上的Table建立联系,否则发挥不了作用。幸好每个Table都可以设置Filters表达式,来对数据进行筛选,见下图:

    六、在cs代码中动态传入参数

    修改Default.aspx.cs的代码,在运行时动态添加参数

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            this.ReportViewer1.LocalReport.ReportPath = "rptDEPT.rdlc";               
            this.ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DS_DEPT", GetDeptData()));
            //动态传入参数
            this.ReportViewer1.LocalReport.SetParameters(new ReportParameter("DeptNo", "02"));
        }
    }

    最终运行结果:

    很多报表中,数据的来源往往不止一个DataTable,下面我们模拟一个简单的主从报表,主报表即为上面的rptDEPT(显示部门信息),子报表(也称从报表)显示部门下的员工清单(命名为rptEMP.rdlc)

    七、创建员工报表rptEMP.rdlc

    布局如下:

    同样,我们也为子报表添加一个参数DeptNo,同时还要为子报表的Table设置Filters条件(条件的值在本例中跟主报表相同,同样都是DeptNo=@DeptNo

    八、在rptDEPT.rdlc中插入子报表rptEMP.rdlc

    子报表控件允许在一个报表中再插入另一个报表,如下图:

    然后在子报表上右击,调出子报表属性

    设置加载哪个子报表

    同时增加一个子报表参数

    注:这里增加一个跟主报表同名的参数DeptNo,同时设置其值为主报表rptDEPT的参数@DeptNo

    九、修改Default.aspx.cs代码

    using System;
    using System.Data;
    using Microsoft.Reporting.WebForms;
     
    namespace ReportSample
    {
        public partial class Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    //定义子报表处理方法
                    this.ReportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing);
                    this.ReportViewer1.LocalReport.ReportPath = "rptDEPT.rdlc";                  
                    this.ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DS_DEPT", GetDeptData()));
                    //动态传入参数
                    this.ReportViewer1.LocalReport.SetParameters(new ReportParameter("DeptNo", "02"));
                }
            }
     
            void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
            {
                e.DataSources.Add(new ReportDataSource("DS_EMP", GetEMPData()));
            }
     
     
            DataTable GetDeptData()
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("DEPTNO", typeof(string));
                dt.Columns.Add("DEPTNAME", typeof(string));
     
                dt.Rows.Add("01", "办公室");
                dt.Rows.Add("02", "技术部");
                dt.Rows.Add("03", "销售部");
                dt.Rows.Add("04", "客服部");
     
                return dt;                
            }
     
            DataTable GetEMPData()
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("EMPNO", typeof(string));
                dt.Columns.Add("EMPNAME", typeof(string));
                dt.Columns.Add("DEPTNO", typeof(string));
     
                dt.Rows.Add("001", "杨过","02");
                dt.Rows.Add("002", "令狐冲", "02");
                dt.Rows.Add("003", "黄蓉", "01");
                dt.Rows.Add("004", "小师妹", "03");
                dt.Rows.Add("005", "赵敏", "04");
     
                return dt;
            }
             
        }
    }

      最终运行效果:

    想想发生了什么?

    主报表rptDept与子报表rptEMP设置了相同的参数以及过滤条件,代码给主报表rptDept传递了参数DeptNo后,主报表rptDept又把参数值传递给子报表rptEMP,最终二个报表都实现了数据筛选.

      

  • 相关阅读:
    QT:不规则窗口的实现
    Sql Server (错误:7302)
    Qt源码分析之信号和槽机制
    Linux下如何发布Qt程序
    QT程序制作deb包并安装在应用程序菜单
    Another Look at Events(再谈Events)
    Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)
    新浪微博回归平静
    Qt中 QString 和int, char等的“相互”转换,关键是QString.toLocal8Bit().data();
    QT中异形窗口的绘制(winEvent处理WM_NCHITTEST消息)
  • 原文地址:https://www.cnblogs.com/daxiongblog/p/9223170.html
Copyright © 2011-2022 走看看