Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I reuse one ReportViewer control for many reports with EF data sources?

I would like to stick with one single form and ReportViewer control, and at runtime assign various reports and data sources. The diverse and complex solutions to this revealed by a quick google check prompted me to rather ask here. How can I achieve this?

like image 349
ProfK Avatar asked Sep 25 '12 13:09

ProfK


People also ask

How do I change the dataset in a Rdlc?

In visual studio if you have the RDLC open you can open the Report Data window by pressing CTRL + ALT + D . From here you click on datasets and then right click on the data set to refresh it. Save this answer.

What is Rdlc report?

What is an RDLC file? The RDLC stands for Report Definition Language Client side. Actually It is an extension of report file created by using Microsoft reporting technology. The SQL Server 2005 version of Report Designer is used to create these files.


2 Answers

You'll need a form featuring a ReportViewer control, RDLC reports, and data sources; there are possibly several ways of implementing this, but you can have a "report manager" class exposing methods that each display a specific report (ex. ShowOrdersReport(), ShowTimeSheetReport(), etc.) - or you could define a base ReportBase class with a Show() method implementation that prompts for parameters when needed... whatever works, it will essentially boil down to this:

var reportForm = new ReportViewerForm(); // instantiate the form
// load the report definition into the viewer:
reportForm.reportViewer1.LocalReport.ReportEmbeddedResource = "Namespace.Report.rdlc";

// loading the data works great with a DataSet:
var data = _reportingDataSet.Tables[0];
// create the ReportDataSource with the report data:
var reportDataSource = new ReportDataSource("rdsReportDataSource", data);

reportForm.ShowReport(new[] { reportDataSource });

Here you'll want to inject the _reportingDataSet dependency; if you're using parameterized stored procedures, you'll want to prompt for the report parameters before you populate the DataSet.

The ShowReport() method adds the data sources to LocalReport.DataSources, and then calls RefreshReport() which displays the report you've specified.

public void ShowReport(IEnumerable<ReportDataSource> dataSources)
{
    foreach (var dataSource in dataSources) 
        reportViewer1.LocalReport.DataSources.Add(dataSource);

    reportViewer1.RefreshReport();
}
like image 176
Mathieu Guindon Avatar answered Sep 18 '22 16:09

Mathieu Guindon


If you are using Crystal report then use this on click of load report button CrystalReportViewer.ReportSource = ReportName

If you are using MS ReportViewer control then it needs two important steps to show the reports

  1. Assign the report file path to the ReportViewer
  2. Set the data source

So for example a ReportViewer control named reportViewer1 needs to display a SomeReport.rdlc file then following code is required (let's say on click of a button)

this.reportViewer1.LocalReport.ReportPath = @"Add absolute path of rdlc file"//e.g. @"C:\SomeReport.rdlc" ;
this.reportViewer1.RefreshReport();

This is just a simple example and for simplicity i have used static report if you need to display data from database just assign datasource property before call to RefreshReport e.g.

this.reportViewer1.LocalReport.DataSources.Add(MyreportDataSource);

where MyreportDataSource is object of type ReportDataSource, you can easily convert any ADO.net DataTable to ReportDataSource object.

I hope this much info will do for you, in case you want to see more details you may refer a very good article at this location

http://www.c-sharpcorner.com/UploadFile/robo60/StandaloneRDLCReports11142007183516PM/StandaloneRDLCReports.aspx

like image 20
Vishal Avatar answered Sep 20 '22 16:09

Vishal