多次使用 RDLC 子报表
本文关键字:报表 RDLC | 更新日期: 2023-09-27 18:34:28
我有一个报告,其中列出了给定storeID,fromDate和toDate的商店的税收。我想在同一父报表中多次将此报表用作子报表。例如,如果使用 storeID 的 1,2,3,4,5,则此子报表将显示 5 次,第一个子报表包含存储 1 的数据,第二个子报表包含存储 2 的数据,依此类推。
这可能吗?我发现一些论坛上,人们询问如何在报表中两次使用相同的子报表,但线程总是在找到某些东西之前就消失了。我还看到您可以使用参数,但我不确定它们是如何工作的(RDLC 中的子报告有点新(。
谢谢!
如果我
理解正确,您可能可以使用一个包含按商店分组的税收表的子报表。
在主报表中,使用 5 个子报表实例。更改每个子报表的 (Name( 属性,但保持子报表路径相同(与已执行的操作相同(。
处理主报表时,LocalReport_SubReportProcessing
根据找到的子报表的实例计数多次调用该方法。
您将创建一个全局变量来保留当前的存储 ID,如下面的代码示例所示。
public class TaxDetailsOfStore
{
public int StoreId { get; set; }
// Your other details here...
}
// This global property be filled for all stores before displaying the main report.
private List<TaxDetailsOfStore> TaxDetailsOfAllStores { get; set; }
private int _storeId = 1; // To start with.
private const int _maxStoreId = 5;
private void LocalReport_SubReportProcessing(object sender, SubreportProcessingEventArgs e)
{
string reportDataSourceName = string.Empty;
object reportDataSourceValue = null;
switch (e.ReportPath)
{
case "SubRprtTaxDetailsOfStore":
int storeId = Convert.ToInt32(e.Parameters["storeId"].Values[0]);
var lstTaxDetailsOfStore = TaxDetailsOfAllStores.FindAll(x => x.StoreId == storeId);
//-------------------------------------------------------------------------------------
// Increment the variable _storeId till reaches _maxStoreId and then back again from 1.
_storeId = _storeId++ % _maxStoreId;
//-------------------------------------------------------------------------------------
reportDataSourceName = "TaxDetailsOfStoreDataSet";
reportDataSourceValue = lstTaxDetailsOfStore;
break;
// Handle other sub reports like this.
//case "SubRprtAnother1":
// object dsSubRprtAnother1 = null;
// reportDataSourceName = "AnotherDataSetName1";
// reportDataSourceValue = dsSubRprtAnother1;
// break;
//case "SubRprtSummary":
// object dsSubRprtSummary = null;
// reportDataSourceName = "SubRprtSummaryDataSet";
// reportDataSourceValue = dsSubRprtSummary;
// break;
}
ReportDataSource reportDataSource = new ReportDataSource
{
Name = reportDataSourceName,
Value = reportDataSourceValue
};
e.DataSources.Add(reportDataSource);
}