ITKeyword,专注技术干货聚合推荐

注册 | 登录

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

sdlcgxcqx 分享于 2010-05-31

2020腾讯云共同战“疫”,助力复工(优惠前所未有!4核8G,5M带宽 1684元/3年),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1054

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

報表中的子報表問題 收藏 注:本文引自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

報表中的子報表問題 收藏 注:本文引自http://www.cnblogs.com/dlwang2002/archive/2006/12/07/585815.html隨心所欲的BLOG Subreport 是报表控件中的一个,可以在报表中嵌套另外一个子报表。这

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。