You can display another report inside the body of a main report using the Report Viewer. The following steps helps you to customize the subreport properties such as data source, report path, and parameters.
To learn how to render a Subreport in a React app, you can watch this video:
Add the subreport and main reports to your application App_Data folder. In this tutorial, the already created reports are used. Refer to the Create RDL Report section or Create RDLC Report section section.
Download the
Side_By_SideMainReport.rdlandSide_By_SideSubReport.rdlreports from here. You can add the report from the Bold Reports® installation location. For more information, refer to Samples and demos. The reports used from the installed location requires theNorthwindIO_Reports.sdfdatabase to run, so add it to your application.
Set the reportPath and reportServiceUrl properties of the Report Viewer as shown in 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>);
}To change the subreport file path, 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");
}
}You can change the parameter default values of a subreport in the OnReportLoaded method of the Web API Controller as given 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" }
});
}
}You can change the credential and connection information of the data sources used in the subreport using the SubReportModel in the 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>"));
}
}You can bind local business object data source collection only for RDLC reports. To specify data source of a RDLC subreport, set the ReportDataSource property in the OnReportLoaded method.
The RDL report has the connection information in report definition itself, so no need to bind the data source.
App_Data folder. You can downloaded it from here.reportPath and reportServiceUrl properties of the Report Viewer as shown in 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 subreport by adding a new item to the DataSources as shown 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 it should be same as in the report definition.
To load subreport as stream, 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() });
}
}