杰瑞科技汇

ReportViewer教程,如何快速上手与使用?

ReportViewer 控件完整教程

目录

  1. 什么是 ReportViewer?
  2. 准备工作:安装和配置
  3. 第一部分:WinForms 中的 ReportViewer
  4. 第二部分:WebForms 中的 ReportViewer
  5. 第三部分:高级主题与最佳实践
  6. 常见问题与故障排除

什么是 ReportViewer?

ReportViewer 是微软官方提供的一个免费控件,允许你在 Windows Forms (WinForms) 或 ASP.NET Web Forms 应用程序中嵌入和显示 SQL Server Reporting Services (SSRS) 报表,它分为两种主要类型:

ReportViewer教程,如何快速上手与使用?-图1
(图片来源网络,侵删)
  • 本地报表:报表定义(.rdlc 文件)和数据处理都在客户端应用程序(WinForms 或 WebForms)中完成,它不依赖于 SSRS 服务器,非常适合离线或自包含的应用。
  • 服务器报表:报表定义和处理都部署在 SSRS 服务器上,你的应用程序作为客户端,通过 URL 或 Web 服务调用服务器上的报表。

本教程将重点介绍更常用、更灵活的本地报表


准备工作:安装和配置

  1. 安装 Visual Studio:确保你安装了 Visual Studio(如 Visual Studio 2025/2025),并勾选了 .NET 桌面开发ASP.NET 和 Web 开发 工作负载。
  2. 安装 NuGet 包
    • 对于 WinForms 项目,Microsoft.ReportViewer.WinForms 包通常随 Visual Studio 一起安装,如果没有,可以通过 NuGet 包管理器安装。
    • 对于 WebForms 项目,Microsoft.ReportViewer.WebForms 包同样需要安装。

第一部分:WinForms 中的 ReportViewer

我们将创建一个简单的 WinForms 应用,从数据库显示数据。

1 创建第一个本地报表

  1. 在你的 WinForms 项目中,右键单击项目 -> 添加 -> 新建项
  2. 选择 报表,然后命名为 SalesReport.rdlc,然后点击 添加
  3. Visual Studio 会打开 报表设计器,界面分为三个部分:
    • 数据集:定义报表的数据结构。
    • 工具箱:提供报表项,如表、矩阵、图表、文本框等。
    • 设计画布:拖拽报表项来设计报表布局。

2 绑定数据源

  1. 创建数据源

    • 在解决方案资源管理器中,右键单击项目 -> 添加 -> 新建数据源
    • 选择 数据库,点击 下一步
    • 选择数据连接(一个 .mdf 文件或 SQL Server 实例),或者新建一个连接,点击 下一步
    • 选择你希望在报表中使用的数据表(Orders 表),勾选它,然后点击 完成
  2. 配置报表数据集

    ReportViewer教程,如何快速上手与使用?-图2
    (图片来源网络,侵删)
    • 回到 SalesReport.rdlc 设计器。
    • 在顶部,你会看到一个下拉菜单,显示你刚刚创建的数据集(DataSet1),选择它。
    • 数据集 窗口会显示 Orders 表的所有列。
    • 工具箱 中拖拽一个 控件到设计画布上。
    • 数据集 窗口中,将 Orders 表的列(如 OrderID, CustomerName, OrderDate, Amount)拖拽到表格的“详细信息”行中。
    • 你可以拖拽 文本框 到“页眉”行来添加列标题。

3 在窗体上使用 ReportViewer

  1. 打开你的主窗体(Form1.cs [设计])。

  2. 工具箱 中找到 ReportViewer 控件(在“数据”类别下),并将其拖到窗体上。

  3. 配置 ReportViewer 控件

    • 选中窗体上的 reportViewer1 控件。
    • 属性 窗口中,找到 ProcessingMode 属性,确保其值为 Local
    • 找到 LocalReport 属性,点击右侧的 按钮。
    • 在弹出的窗口中,点击 添加 按钮,选择你之前创建的 SalesReport.rdlc 文件。
    • 点击 确定
  4. 加载数据

    ReportViewer教程,如何快速上手与使用?-图3
    (图片来源网络,侵删)
    • 在窗体的代码中(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 窗体和报表

  1. 创建一个 ASP.NET Web 应用程序项目。
  2. 添加一个 Web 窗体(Default.aspx)。
  3. 添加一个 本地报表 文件(SalesReport.rdlc),步骤与 WinForms 相同。
  4. 创建数据源(DataSet1)并绑定到 .rdlc 文件,步骤与 WinForms 相同。

2 配置 Web.config

这是 WebForms 中至关重要的一步,ReportViewer 需要 httphandlerhttpmodule 来处理请求。

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.WebForms NuGet 包的版本相匹配,你可以通过查看 NuGet 包的详细信息来确认版本号。

3 在页面中使用 ReportViewer

  1. 打开 Default.aspx 的设计视图。

  2. 工具箱 中拖拽一个 ReportViewer 控件到页面上。

  3. 配置 ReportViewer 控件

    • 选中 reportViewer1 控件。
    • 属性 窗口中,设置 ProcessingModeLocal
    • 点击 LocalReport 属性的 按钮,添加 SalesReport.rdlc 文件。
  4. 加载数据: 在 Default.aspx.csPage_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 动态传递参数

  1. 在 .rdlc 文件中添加参数

    • 在报表设计器中,右键点击设计画布 -> 报表参数
    • 点击 添加,创建一个新参数(StartDate),设置其名称、数据类型(如 System.DateTime)和默认值。
  2. 修改查询

    • 返回到数据集定义(通常在报表设计器顶部或通过“数据”->“数据源”->“数据集属性”访问)。
    • 修改查询语句,使其包含参数,WHERE OrderDate >= @StartDate
    • 在查询参数部分,将 @StartDate 映射到报表参数 Parameters!StartDate.Value
  3. 在代码中传递参数

    // 在 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应用、离线应用 企业级报表系统、需要集中管理报表的场景

常见问题与故障排除

  1. Could not load file or assembly 'Microsoft.ReportViewer.Common...'Could not load type...

    • 原因:程序集缺失或版本不匹配。
    • 解决:通过 NuGet 包管理器重新安装 Microsoft.ReportViewer.WinFormsMicrosoft.ReportViewer.WebForms 包,确保项目引用和 GAC 中的版本一致。
  2. The report definition has an invalid target namespace... (WebForms)

    • 原因Web.config 中缺少 httphandlerhttpmodule 配置,或者版本号不正确。
    • 解决:仔细检查 Web.config 中的配置,确保 Version 属性与你安装的 NuGet 包版本完全匹配。
  3. 报表显示空白,没有数据

    • 原因
      • 数据查询返回空结果集。
      • ReportDataSource 的名称(如 "DataSet1")与 .rdlc 文件中定义的数据集名称不匹配(这是最常见的原因)。
      • Form_LoadPage_Load 事件中的绑定代码没有执行。
    • 解决:使用断点调试,检查 DataTable 中是否有数据,并仔细核对数据集名称。
  4. The permissions granted to user... are insufficient for performing this operation.

    • 原因:通常发生在服务器报表场景,客户端应用没有权限访问 SSRS 服务器。
    • 解决:在 SSRS 报理员中,配置报表的“数据源”和“角色”权限,确保用户有足够的权限查看报表。

希望这份详细的教程能帮助你顺利上手 ReportViewer 控件!

分享:
扫描分享到社交APP
上一篇
下一篇