Microsoft Report Viewer May 2026
Key considerations:
If you search for "Report Viewer" in NuGet, you will find several packages. It is vital to choose the right version for your project.
The Microsoft Report Viewer is a redistributable control that processes and displays .rdlc (Report Definition Language Client-side) and .rdl (Report Definition Language) files. It acts as a rendering engine that can operate in two distinct modes:
This duality makes the Report Viewer flexible. You can use it in offline-capable desktop apps (Local Mode) or as a thin viewer for centralized corporate reports (Remote Mode).
This is the most common "offline" reporting pattern.
Step 1: Add a Report (RDLC) to your project.
Right-click project в†’ Add в†’ New Item в†’ Report. Design your table using the drag-and-drop designer (Tablix, Textbox, Image).
Step 2: Create a DataSet.
From the Toolbox, add a DataSet (MyDataSet.xsd). Define a DataTable (e.g., SalesData with columns Product, Quantity, Price). microsoft report viewer
Step 3: Bind DataSet to the RDLC.
Open the RDLC file. Go to View в†’ Report Data. Right-click DataSets в†’ Add Dataset. Set the DataSource to MyDataSet and the available dataset to SalesData.
Step 4: Code-behind in WinForms.
using Microsoft.Reporting.WinForms;
private void Form1_Load(object sender, EventArgs e)
// 1. Fetch your data (could be from SQL, JSON, or CSV)
DataTable dt = GetSalesDataFromDatabase();
// 2. Set the report viewer's processing mode to Local
reportViewer1.ProcessingMode = ProcessingMode.Local;
// 3. Define the report path (relative to the executable)
reportViewer1.LocalReport.ReportPath = "Reports\\SalesReport.rdlc";
// 4. Add the data source
ReportDataSource rds = new ReportDataSource("SalesData", dt);
reportViewer1.LocalReport.DataSources.Clear();
reportViewer1.LocalReport.DataSources.Add(rds);
// 5. (Optional) Set parameters
var param = new ReportParameter("ReportTitle", "Q2 Sales");
reportViewer1.LocalReport.SetParameters(param);
// 6. Refresh the report
reportViewer1.RefreshReport();
Do not use the MSI. You must use NuGet.
WinForms:
Install-Package Microsoft.ReportingServices.ReportViewerControl.WinForms
ASP.NET WebForms:
Install-Package Microsoft.ReportingServices.ReportViewerControl.WebForms
Important: For .NET Core/5+ projects, you must enable EnableUnsafeBinaryFormatterSerialization due to legacy serialization requirements in the reporting engine.
Given the limitations, many organizations are shifting away from Report Viewer: Key considerations:
| Alternative | Type | Best for |
| --- | --- | --- |
| Power BI Embedded | Cloud/SaaS | Interactive dashboards, modern web apps |
| DevExpress Reporting | Commercial | WinForms, WPF, Web, .NET Core |
| Telerik Reporting | Commercial | Cross-platform, modern UI |
| Stimulsoft | Commercial | Flexible exports and embedded reports |
| FastReport | Commercial (and OSS version) | Lightweight, cross-platform |
| Plain SSRS + URL Access | Server-only | Direct SSRS rendering without Report Viewer control |
| List & Label | Commercial | High-volume, pixel-perfect |
One of the most confusing aspects of the Report Viewer for new developers is the distinction between Processing Modes. Understanding this is crucial for architecture and deployment.
| Feature | .rdlc (Local Mode) | .rdl (Remote Mode) |
| --- | --- | --- |
| Processing engine | Client-side (within application) | SSRS server |
| Data source | Any .NET object: DataTable, IEnumerable, BusinessObject | SSRS shared data sources / server datasources |
| Deployment | File embedded in project or copied as content | Stored on SSRS server |
| Subreports | Must be nested within main report file | Can reference separate .rdl |
| Report Server features | Not available (no schedules, subscriptions, caching) | Full server-side management |
Note: .rdlc stands for Report Definition Language Client-side – technically the same XML schema as .rdl but processed locally.