zoukankan      html  css  js  c++  java
  • RDLC报表应用之Subreport (传递Parameter and ReportDataSource)


      关于报表之了报表的应用无非就是以下几点:

              1:配置子报数据源

               2:怎样配置子报表传输的参数项

    个人处于对RDLC报表的喜欢,所以摘取来了,原文网址

     下面是蜡人张写的一篇子报表应用;原文网址


    Subreport 是报表控件中的一个,可以在报表中嵌套另外一个子报表。这里讨论的就是如何使用这个subreport。主要包括:如何填充数据(ReportDataSource),如何向子报表传递参数(Parameter)。

        关于subreport的应用,有人已经作了论述(http://www.cnblogs.com/waxdoll/archive/2006/10/13/458409.html)。这个应用里面已经解释得比较详细了,关于如何定义数据源,如何使用SubreportProcessing事件等。我这里作其他的论述(例子是从我的一个报表模块里面摘出的代码)。从外部传递过去的东西也就是主要分为两类:数据源和参数。


       1:关于数据传递

              reportManager.Viewer.LocalReport.SubreportProcessing += new Microsoft.Reporting.WebForms.SubreportProcessingEventHandler(LocalReport_SubreportProcessing);

           这是事件代理,用于在子报表加载时向子报表提供数据源(仅仅是数据源,而不是参数。这个就是我所遇到的问题)

        这是提供数据源的函数

          void LocalReport_SubreportProcessing(object sender, Microsoft.Reporting.WebForms.SubreportProcessingEventArgs e)

         {

                string sql2 = "Select * from T1 where id>" + id;

                DataSet ds1 = Manager.GetORManager().GetDataSet(sql2);

                e.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource(reportName, ds1.Tables[0]));

            }

        sender就是LocalReport对象,e是事件参数,可以向里面传递数据

        几个要说明的问题

        首先,主报表和子报表中定义的数据源名称可以一样么?事实上,可以。

        为什么会有这个问题呢?我上边的应用是在一个报表模块里面的,主报表和子报表有相同的参数和数据源(都是”Dataset_Table_1”)。所以,如果我向里传递了两个DataTable,重名,并且ReportDataSource也是重名,那么报表可以区分这些数据么?(当然,两个报表数据源里面的字段名也几乎都是一样)。经过测试,没有问题。

        也就是说,报表接受的两个(或者多个)数据源,会被送到不同地方的报表,互不干扰。

        这个功能不错,特别是对于我的这个报表模块


       2:关于参数传递

          然后,第二个问题,参数可以互不干扰的传递进去么?答案是:不能。

          很遗憾。

          从 void LocalReport_SubreportProcessing里面看,这里接受到的参数只有两个,一个是LocalReport,一个是e。在主报表加载的时候,我们可以这样处理:

               ReportParameter[] param = new ReportParameter[_fieldMapTable.Count];

                //map the column and paran

                foreach (DictionaryEntry de in _fieldMapTable)

                {

                    string mapTarget = de.Key.ToString();//standard name

                    string mapFrom = de.Value.ToString();//ur name

                     param[i++] = new ReportParameter("Report_Parameter_" + mapTarget, mapFrom);//push param in

                }

                try

                {

                    //set param

                    reportView.LocalReport.SetParameters(param);

                    //set data source

                    reportView.LocalReport.DataSources.Add(new ReportDataSource(this._dataSetName, dataTable));//set DataSetName here

                    //refresh, to show

                    reportView.LocalReport.Refresh();

                }……

         可以看到,我们在这里向报表传递了参数param。这是一个参数数组。同样的方法,我们能在LocalReport_SubreportProcessing里面应用么?不能,因为这个时候,(sender as LocalReport)已经成了一个只读的状态((sender as LocalReport).SetParameters(param);),无法传递任何参数。然后e呢?可惜的很,e.Parameters也是只读的。

         在程序里面,我找不到方法向子报表传递参数。

         其他地方倒还是有些办法的,就在主报表中的subreport控件的属性里面设置参数,通过主报表传递过去。

         这个使用方法,“蜡人张”的文章里面也有:在subreport上右键 / 属性 /参数 /设置子报表的参数 = 主报表的参数(或者字段)名称。需要注意的是:子报表中的参数名称不能和主报表中的参数重名。这个正好和数据源相反。

         在我的应用里面,没个报表都有相同的参数设置,这下子,就有点麻烦了,需要调整一些实现。

     

    后记

    报表的头(page header)和尾(page footer)中是不能绑定Filed的,只能绑定Parameter。如果Parameter不能方便的传递,应用中就有小麻烦了。

    事实这种情况倒是还不会出现,因为子报表基本不会再出现page header了。


       

       


      


  • 相关阅读:
    记第一场省选
    POJ 2083 Fractal 分形
    CodeForces 605A Sorting Railway Cars 思维
    FZU 1896 神奇的魔法数 dp
    FZU 1893 内存管理 模拟
    FZU 1894 志愿者选拔 单调队列
    FZU 1920 Left Mouse Button 简单搜索
    FZU 2086 餐厅点餐
    poj 2299 Ultra-QuickSort 逆序对模版题
    COMP9313 week4a MapReduce
  • 原文地址:https://www.cnblogs.com/yhongl/p/3937902.html
Copyright © 2011-2022 走看看