多次使用 RDLC 子报表

本文关键字:报表 RDLC | 更新日期: 2023-09-27 18:34:28

我有一个报告,其中列出了给定storeID,fromDate和toDate的商店的税收。我想在同一父报表中多次将此报表用作子报表。例如,如果使用 storeID 的 1,2,3,4,5,则此子报表将显示 5 次,第一个子报表包含存储 1 的数据,第二个子报表包含存储 2 的数据,依此类推。

这可能吗?我发现一些论坛上,人们询问如何在报表中两次使用相同的子报表,但线程总是在找到某些东西之前就消失了。我还看到您可以使用参数,但我不确定它们是如何工作的(RDLC 中的子报告有点新(。

谢谢!

多次使用 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);
    }