RDLC报表应用之Subreport (传递Parameter and ReportDataSource)

来源:互联网 发布:淘宝2014年销售额 编辑:程序博客网 时间:2024/06/13 04:04

報表中的子報表問題 收藏
注:本文引自http://www.cnblogs.com/dlwang2002/archive/2006/12/07/585815.html隨心所欲的BLOG
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了。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yyed/archive/2008/06/13/2542495.aspx

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 红米手机很卡怎么办啊 红米2a显示图标怎么办 手机一直处于开机状态怎么办 vivo手机进水开不了机怎么办 魅蓝s6锁了怎么办 pos机刷卡刷多了怎么办 红米5a开不机怎么办 魅族双亲要密码怎么办? 苹果wi-fi网速慢怎么办 腾达宽带用户名密码忘了怎么办 无线网秘密忘了怎么办 wan口设置已断开怎么办 中兴手机忘记解锁图案怎么办 u盘显示参数错误怎么办 硬盘vc加密密码忘了怎么办 软件文件移动到其他盘打不开怎么办 u盘无法复制文件怎么办 u盘大文件不能拷怎么办 abc看图打印不了怎么办 百度云大文件慢怎么办 手机视频缩略图加载失败怎么办 电脑突然卡住不动了怎么办 word文档被锁住了怎么办 手机qq磁盘已满怎么办 不小心格式化了硬盘怎么办 移动硬盘插上显示要格式化怎么办 微信网络特别慢怎么办 苹果六网速太慢怎么办 小米手机wifi网速慢怎么办 苹果8蜂窝上网慢怎么办 苹果6s4g网速慢怎么办 苹果7上网速度慢怎么办 银行转账到别人账户怎么办 银行转账转错账户怎么办 人已故欠的公款怎么办 论文抄了表格数据怎么办 电子转账转错了怎么办 苹果手机付款方式有问题怎么办 合同中付款方式错怎么办? 优步付款方式无效怎么办 工程付款方式变更没有合同怎么办