Render subreport

To render a subreport in the Bold Reports® React Report Viewer, add the main report and subreport to your application and load them through the Web API service. A subreport displays another report inside the body of the main report. The following steps help you customize the subreport properties such as data source, report path, and parameters.

To learn how to render a Subreport in a React application, you can watch this video:

 function App() {
     return (<div id="viewer" style={viewerStyle}>
     <BoldReportViewerComponent id="reportviewer-container"
     reportServiceUrl = { 'https://demos.boldreports.com/services/api/ReportViewer'}
     reportPath = { 'Side_By_SideMainReport.rdl' }
     >
     </BoldReportViewerComponent>
     </div>);
   }
  • Build and run the application.

How do I change the subreport path?

To change the subreport file path in the React Report Viewer, set the ReportPath property of SubReportModel in the OnInitReportOptions method.

        [NonAction]
        public void OnInitReportOptions(ReportViewerOptions reportOption)
        {
            if (reportOption.SubReportModel != null)
            {
                reportOption.SubReportModel.ReportPath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/App_Data/SubReport_Detail.rdl");
            }
        }

How do I set a subreport parameter?

To change the parameter default values of a subreport in the React Report Viewer, set them in the OnReportLoaded method of the Web API Controller, as in the following code snippet:

        [NonAction]
        public void OnReportLoaded(ReportViewerOptions reportOption)
        {
            if (reportOption.SubReportModel != null)
            {
                reportOption.SubReportModel.Parameters = new BoldReports.Web.ReportParameterInfoCollection();
                reportOption.SubReportModel.Parameters.Add(new BoldReports.Web.ReportParameterInfo()
                {
                    Name = "SalesPersonID",
                    Values = new List<string>() { "2" }
                });
            }
        }

How do I modify the subreport data source connection string?

To change the credential and connection information of the data sources used in a subreport, use the SubReportModel in the React Report Viewer OnInitReportOptions method.

        [NonAction]
        public void OnInitReportOptions(ReportViewerOptions reportOption)
        {
            if (reportOption.SubReportModel != null)
            {
                reportOption.SubReportModel.DataSourceCredentials = new List<BoldReports.Web.DataSourceCredentials>();
                reportOption.SubReportModel.DataSourceCredentials.Add(new BoldReports.Web.DataSourceCredentials("<database>", "Data Source=<instancename>;Initial Catalog=<database>;user id=<username>;password=<password>"));
            }
        }

How do I set a subreport data source?

To set the data source of an RDLC subreport in the React Report Viewer, set the ReportDataSource property in the OnReportLoaded method. You can bind a local business object data source collection only for RDLC reports.

An RDL report has the connection information in the report definition itself, so you do not need to bind a data source.

  1. Add the RDLC subreport and main reports to your application App_Data folder. You can download the Product List reports.
  2. Set the reportPath and reportServiceUrl properties of the Report Viewer as in the following code snippet:
 function App() {
     return (<div id="viewer" style={viewerStyle}>
     <BoldReportViewerComponent id="reportviewer-container"
     reportServiceUrl = { 'https://demos.boldreports.com/services/api/ReportViewer'}
     reportPath = { 'Side_By_SideMainReport.rdl' }
     >
     </BoldReportViewerComponent>
     </div>);
   }
  • Create a class and methods that returns business object data collection. Use the following code in your application Web API Service.

    public class ProductList
    {
        public string ProductName { get; set; }
        public string OrderId { get; set; }
        public double Price { get; set; }
        public string Category { get; set; }
        public string Ingredients { get; set; }
        public string ProductImage { get; set; }
    
        public static IList GetData()
        {
            List<ProductList> datas = new List<ProductList>();
            ProductList data = null;
            data = new ProductList()
            {
                ProductName = "Baked Chicken and Cheese",
                OrderId = "323B60",
                Price = 55,
                Category = "Non-Veg",
                Ingredients = "grilled chicken, corn and olives.",
                ProductImage = ""
            };
            datas.Add(data);
            data = new ProductList()
            {
                ProductName = "Chicken Delite",
                OrderId = "323B61",
                Price = 100,
                Category = "Non-Veg",
                Ingredients = "cheese, chicken chunks, onions & pineapple chunks.",
                ProductImage = ""
            };
            datas.Add(data);
            data = new ProductList()
            {
                ProductName = "Chicken Tikka",
                OrderId = "323B62",
                Price = 64,
                Category = "Non-Veg",
                Ingredients = "onions, grilled chicken, chicken salami & tomatoes.",
                ProductImage = ""
            };
            datas.Add(data);
    
            return datas;
        }
    }
  • Bind the business object data values collection to the subreport by adding a new item to the DataSources as in the following code snippet:

        [NonAction]
        public void OnReportLoaded(ReportViewerOptions reportOption)
        {
            //Assigning the data source for 'Product List.rdlc'
            if (reportOption.SubReportModel != null)
            {
                reportOption.SubReportModel.DataSources = new BoldReports.Web.ReportDataSourceCollection();
                reportOption.SubReportModel.DataSources.Add(new BoldReports.Web.ReportDataSource { Name = "list", Value = ProductList.GetData() });
            }
        }

The data source name is case sensitive and must be the same as in the report definition.

How do I load a subreport as a stream?

To load a subreport as a stream in the React Report Viewer, set the Stream property in the OnInitReportOptions method.

        [NonAction]
        public void OnInitReportOptions(ReportViewerOptions reportOption)
        {
            if (reportOption.SubReportModel != null)
            {
                // Opens the report from application App_Data folder using FileStream and loads the sub report stream.
                FileStream reportStream = new FileStream(System.Web.Hosting.HostingEnvironment.MapPath(@"~/App_Data/Product List.rdlc"), FileMode.Open, FileAccess.Read);
                reportOption.SubReportModel.Stream = reportStream;
            }
        }
        [NonAction]
        public void OnReportLoaded(ReportViewerOptions reportOption)
        {
            //Assigning the data source for 'Product List.rdlc'
            if (reportOption.SubReportModel != null)
            {
                reportOption.SubReportModel.DataSources = new BoldReports.Web.ReportDataSourceCollection();
                reportOption.SubReportModel.DataSources.Add(new BoldReports.Web.ReportDataSource { Name = "list", Value = ProductList.GetData() });
            }
        }