ReportViewer 控件完整教程
目录
- 什么是 ReportViewer?
- 准备工作:安装和配置
- 第一部分:WinForms 中的 ReportViewer
- 第二部分:WebForms 中的 ReportViewer
- 第三部分:高级主题与最佳实践
- 常见问题与故障排除
什么是 ReportViewer?
ReportViewer 是微软官方提供的一个免费控件,允许你在 Windows Forms (WinForms) 或 ASP.NET Web Forms 应用程序中嵌入和显示 SQL Server Reporting Services (SSRS) 报表,它分为两种主要类型:

- 本地报表:报表定义(.rdlc 文件)和数据处理都在客户端应用程序(WinForms 或 WebForms)中完成,它不依赖于 SSRS 服务器,非常适合离线或自包含的应用。
- 服务器报表:报表定义和处理都部署在 SSRS 服务器上,你的应用程序作为客户端,通过 URL 或 Web 服务调用服务器上的报表。
本教程将重点介绍更常用、更灵活的本地报表。
准备工作:安装和配置
- 安装 Visual Studio:确保你安装了 Visual Studio(如 Visual Studio 2025/2025),并勾选了 .NET 桌面开发 或 ASP.NET 和 Web 开发 工作负载。
- 安装 NuGet 包:
- 对于 WinForms 项目,
Microsoft.ReportViewer.WinForms包通常随 Visual Studio 一起安装,如果没有,可以通过 NuGet 包管理器安装。 - 对于 WebForms 项目,
Microsoft.ReportViewer.WebForms包同样需要安装。
- 对于 WinForms 项目,
第一部分:WinForms 中的 ReportViewer
我们将创建一个简单的 WinForms 应用,从数据库显示数据。
1 创建第一个本地报表
- 在你的 WinForms 项目中,右键单击项目 -> 添加 -> 新建项。
- 选择 报表,然后命名为
SalesReport.rdlc,然后点击 添加。 - Visual Studio 会打开 报表设计器,界面分为三个部分:
- 数据集:定义报表的数据结构。
- 工具箱:提供报表项,如表、矩阵、图表、文本框等。
- 设计画布:拖拽报表项来设计报表布局。
2 绑定数据源
-
创建数据源:
- 在解决方案资源管理器中,右键单击项目 -> 添加 -> 新建数据源。
- 选择 数据库,点击 下一步。
- 选择数据连接(一个
.mdf文件或 SQL Server 实例),或者新建一个连接,点击 下一步。 - 选择你希望在报表中使用的数据表(
Orders表),勾选它,然后点击 完成。
-
配置报表数据集:
(图片来源网络,侵删)- 回到
SalesReport.rdlc设计器。 - 在顶部,你会看到一个下拉菜单,显示你刚刚创建的数据集(
DataSet1),选择它。 - 数据集 窗口会显示
Orders表的所有列。 - 从 工具箱 中拖拽一个 表 控件到设计画布上。
- 在 数据集 窗口中,将
Orders表的列(如OrderID,CustomerName,OrderDate,Amount)拖拽到表格的“详细信息”行中。 - 你可以拖拽 文本框 到“页眉”行来添加列标题。
- 回到
3 在窗体上使用 ReportViewer
-
打开你的主窗体(
Form1.cs[设计])。 -
从 工具箱 中找到 ReportViewer 控件(在“数据”类别下),并将其拖到窗体上。
-
配置 ReportViewer 控件:
- 选中窗体上的
reportViewer1控件。 - 在 属性 窗口中,找到
ProcessingMode属性,确保其值为Local。 - 找到
LocalReport属性,点击右侧的 按钮。 - 在弹出的窗口中,点击 添加 按钮,选择你之前创建的
SalesReport.rdlc文件。 - 点击 确定。
- 选中窗体上的
-
加载数据:
(图片来源网络,侵删)- 在窗体的代码中(
Form1_Load事件),你需要将数据填充到报表的数据集中。
using System.Data; using System.Data.SqlClient; using Microsoft.Reporting.WinForms; public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // 1. 获取数据 DataTable dt = GetDataFromDatabase(); // 2. 将数据绑定到 ReportViewer 的 LocalReport reportViewer1.LocalReport.DataSources.Clear(); // 清除旧数据源 ReportDataSource rds = new ReportDataSource("DataSet1", dt); // "DataSet1" 必须与 .rdlc 文件中定义的数据集名称完全一致 reportViewer1.LocalReport.DataSources.Add(rds); // 3. 刷新报表 reportViewer1.RefreshReport(); } private DataTable GetDataFromDatabase() { // 示例:从 SQL Server 数据库获取数据 // 请根据你的实际情况修改连接字符串和查询语句 string connectionString = "Your_Connection_String"; string query = "SELECT OrderID, CustomerName, OrderDate, Amount FROM Orders"; using (SqlConnection con = new SqlConnection(connectionString)) using (SqlCommand cmd = new SqlCommand(query, con)) { SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); return dt; } } } - 在窗体的代码中(
4 运行和预览
按 F5 运行你的应用程序,你应该能看到一个带有报表查看工具栏的窗口,报表中显示了从数据库查询到的数据。
第二部分:WebForms 中的 ReportViewer
WebForms 下的步骤与 WinForms 类似,但有一些关键区别,尤其是在配置上。
1 创建 Web 窗体和报表
- 创建一个 ASP.NET Web 应用程序项目。
- 添加一个 Web 窗体(
Default.aspx)。 - 添加一个 本地报表 文件(
SalesReport.rdlc),步骤与 WinForms 相同。 - 创建数据源(
DataSet1)并绑定到.rdlc文件,步骤与 WinForms 相同。
2 配置 Web.config
这是 WebForms 中至关重要的一步,ReportViewer 需要 httphandler 和 httpmodule 来处理请求。
在 Web.config 文件的 <system.web> 节点内添加以下配置:
<configuration>
<system.web>
<!-- ... 其他配置 ... -->
<!-- 添加 HTTP 处理程序和模块 -->
<httpHandlers>
<add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</httpHandlers>
<httpModules>
<add name="ReportViewerHTTPModule" type="Microsoft.Reporting.WebForms.HttpModule, Microsoft.ReportViewer.WebForms, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</httpModules>
</system.web>
<!-- 对于 IIS 7.0 及以上版本,还需要在 system.webServer 节点中添加 -->
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<add name="ReportViewerWebControlHandler" verb="*" path="Reserved.ReportViewerWebControl.axd" preCondition="integratedMode,classicMode" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</handlers>
<modules runAllManagedModulesForAllRequests="true">
<add name="ReportViewerHTTPModule" type="Microsoft.Reporting.WebForms.HttpModule, Microsoft.ReportViewer.WebForms, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</modules>
</system.webServer>
</configuration>
注意:
Version号(如0.0.0)需要与你安装的Microsoft.ReportViewer.WebFormsNuGet 包的版本相匹配,你可以通过查看 NuGet 包的详细信息来确认版本号。
3 在页面中使用 ReportViewer
-
打开
Default.aspx的设计视图。 -
从 工具箱 中拖拽一个 ReportViewer 控件到页面上。
-
配置 ReportViewer 控件:
- 选中
reportViewer1控件。 - 在 属性 窗口中,设置
ProcessingMode为Local。 - 点击
LocalReport属性的 按钮,添加SalesReport.rdlc文件。
- 选中
-
加载数据: 在
Default.aspx.cs的Page_Load事件中编写代码:using System.Data; using System.Data.SqlClient; using Microsoft.Reporting.WebForms; public partial class _Default : Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 1. 获取数据 DataTable dt = GetDataFromDatabase(); // 2. 将数据绑定到 ReportViewer 的 LocalReport reportViewer1.LocalReport.DataSources.Clear(); ReportDataSource rds = new ReportDataSource("DataSet1", dt); // "DataSet1" 必须与 .rdlc 文件中定义的数据集名称完全一致 reportViewer1.LocalReport.DataSources.Add(rds); // 3. 刷新报表 reportViewer1.LocalReport.Refresh(); } } private DataTable GetDataFromDatabase() { // 示例:从 SQL Server 数据库获取数据 string connectionString = "Your_Connection_String"; string query = "SELECT OrderID, CustomerName, OrderDate, Amount FROM Orders"; using (SqlConnection con = new SqlConnection(connectionString)) using (SqlCommand cmd = new SqlCommand(query, con)) { SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); return dt; } } }
第三部分:高级主题与最佳实践
1 动态传递参数
-
在 .rdlc 文件中添加参数:
- 在报表设计器中,右键点击设计画布 -> 报表参数。
- 点击 添加,创建一个新参数(
StartDate),设置其名称、数据类型(如System.DateTime)和默认值。
-
修改查询:
- 返回到数据集定义(通常在报表设计器顶部或通过“数据”->“数据源”->“数据集属性”访问)。
- 修改查询语句,使其包含参数,
WHERE OrderDate >= @StartDate。 - 在查询参数部分,将
@StartDate映射到报表参数Parameters!StartDate.Value。
-
在代码中传递参数:
// 在 Form1_Load 或 Page_Load 中 ReportParameter rp = new ReportParameter("StartDate", DateTime.Now.AddDays(-30).ToString("yyyy-MM-dd")); reportViewer1.LocalReport.SetParameters(new ReportParameter[] { rp }); reportViewer1.LocalReport.DataSources.Clear(); // ... 绑定数据源 reportViewer1.LocalReport.Refresh();
2 处理报表事件
你可以处理 ReportViewer 的事件,例如在用户点击“导出”按钮时执行自定义逻辑。
// 在窗体或页面加载时订阅事件
reportViewer1.LocalReport.SubreportProcessing += LocalReport_SubreportProcessing;
private void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
{
// 处理子报表的数据
// e.DataSources.Add(...);
}
3 导出报表
ReportViewer 内置了导出功能(Excel, PDF, Word 等),用户只需点击工具栏上的按钮即可,你也可以通过代码触发导出。
// 导出为 PDF 到文件
byte[] bytes = reportViewer1.LocalReport.Render("PDF");
string filePath = @"C:\Reports\SalesReport.pdf";
System.IO.File.WriteAllBytes(filePath, bytes);
4 本地报表 vs. 服务器报表
| 特性 | 本地报表 (.rdlc) | 服务器报表 (SSRS) |
|---|---|---|
| 依赖性 | 不需要 SSRS 服务器 | 需要 SSRS 服务器 |
| 部署 | 随应用程序一起部署 | 部署到 SSRS 服务器 |
| 数据处理 | 在客户端应用中完成 | 在 SSRS 服务器上完成 |
| 性能 | 数据量不大时性能好 | 大数据量下性能更优,服务器有缓存机制 |
| 功能 | 功能相对固定 | 功能强大,支持订阅、数据驱动订阅等企业级功能 |
| 适用场景 | 桌面应用、小型Web应用、离线应用 | 企业级报表系统、需要集中管理报表的场景 |
常见问题与故障排除
-
Could not load file or assembly 'Microsoft.ReportViewer.Common...'或Could not load type...- 原因:程序集缺失或版本不匹配。
- 解决:通过 NuGet 包管理器重新安装
Microsoft.ReportViewer.WinForms或Microsoft.ReportViewer.WebForms包,确保项目引用和 GAC 中的版本一致。
-
The report definition has an invalid target namespace...(WebForms)- 原因:
Web.config中缺少httphandler或httpmodule配置,或者版本号不正确。 - 解决:仔细检查
Web.config中的配置,确保Version属性与你安装的 NuGet 包版本完全匹配。
- 原因:
-
报表显示空白,没有数据
- 原因:
- 数据查询返回空结果集。
ReportDataSource的名称(如"DataSet1")与.rdlc文件中定义的数据集名称不匹配(这是最常见的原因)。Form_Load或Page_Load事件中的绑定代码没有执行。
- 解决:使用断点调试,检查
DataTable中是否有数据,并仔细核对数据集名称。
- 原因:
-
The permissions granted to user... are insufficient for performing this operation.- 原因:通常发生在服务器报表场景,客户端应用没有权限访问 SSRS 服务器。
- 解决:在 SSRS 报理员中,配置报表的“数据源”和“角色”权限,确保用户有足够的权限查看报表。
希望这份详细的教程能帮助你顺利上手 ReportViewer 控件!
