65.9K
CodeProject 正在变化。 阅读更多。
Home

将 Reporting Services 与 VS.NET 页面和 VS.NET 控件集成

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (10投票s)

2005 年 8 月 31 日

5分钟阅读

viewsIcon

162407

将报表服务与 VS.NET 页面和 VS.NET 控件集成。

引言

我将非常快速且深入地介绍 .aspx 页面与报表服务报表的集成。如果您刚接触报表服务,那么本文不适合您。我将向您展示如何将报表集成到 .aspx 页面中,并通过 Web 服务器控件(例如下拉列表框和日历)修改报表的内容。我假定您已设置好开发机器,并安装了 SQL Server 开发版、Visual Studio .NET 以及 Reporting Services,并且客户端也安装了在线示例和图书。我将不讨论设计报表和将报表放置在您的报表服务器上。

获取 Microsoft Report Viewer

在 Microsoft Reporting Services 随附的示例中,有一个 Report Viewer,它同时提供 VB 和 C# 版本。我将专注于 C# 版本。Report Viewer 允许您在 .aspx 页面上与其他控件和 HTML 内联显示报表。

您可以在此处找到 Report Viewer 项目

C:\Program Files\Microsoft SQL Server\MSSQL\Reporting 
               Services\Samples\Applications\ReportViewer\

您可以将此项目作为子项目添加到您的解决方案中,或者将项目编译为 DLL,然后将该 DLL 作为引用添加到您的新报表项目中。我们将采用后一种方法,并将编译后的 DLL 添加到我们的新项目中。

  1. 打开示例中的 ReportViewer 文件夹,然后浏览到 cs(适用于 C# 版本)。
  2. 双击或打开 ReportViewer.sln(即在 Visual Studio 中打开 ReportView 解决方案)。
  3. 构建解决方案。
  4. 关闭项目。

Visual Studio 现在会创建几个额外的目录,包括一个 bin 目录,其中包含 ReportViewer.dll 的调试版本(如果您愿意,可以更改生成类型以生成发布版本)。

配置 VS 以使用 Report Viewer

现在您可以将 ReportViewer.dll 添加到您的 Web 项目中以查看报表。

  1. ReportViewer.dll 复制到您的 bin 目录或您的 Web 项目中。
  2. 在“解决方案资源管理器”中:右键单击“引用”,选择“添加引用”,然后转到“项目”选项卡,浏览并选择您 bin 目录中的 ReportViewer.dll
  3. 现在将 ReportViewer 文档添加到工具箱:右键单击“工具箱”,选择“添加/删除项”,浏览到 bin 目录并选择 ReportViewer.dll

您的 Visual Studio 工具箱中应该会出现 ReportViewer

在网页上显示简单的 Report Viewer

这是最简单的一步,将 ReportViewer 从工具箱拖到您的网页上。

现在,我们需要告诉 ReportView 在哪里查找报表。右键单击以查看 ReportViewer 的属性。

如上所示,我已经设置了 ServerUrlReportPath。这将显示报表,就像在报表服务器的默认网页上显示一样,只不过它被封装在一个 ASP.NET 网页中。除非您指定了报表的 ServerURLReportPath,否则该组件不允许您更改网页上报表的大小和高度。

有用参数

  • ServerUrl:您的 MS Reporting Server 安装的网站服务器。
  • ReportPath:Reporting Server 上的报表路径(包括文件夹/报表名称)。
  • ToolBar:打开或关闭工具栏,方便导出到 Excel、PDF 等。
  • Parameters:向用户显示参数字段(即驱动报表数据的输入字段)。
  • Zoom:方便直接从网页打印。

顶级技巧:将 ServerURL 存储在 web.config 的应用程序键中,以便在整个应用程序中使用。系统管理员有时会更改后端服务器。

web.config

<appSettings>t;
    <add key="Key_ReportServer" 
         value="http://myServer/reportserver"/>
</appSettings>

C# 代码

private void Page_Load(object sender, System.EventArgs e)
{
    // Put user code to initialize the page here

    ReportViewer1.ServerUrl  = 
      (ConfigurationSettings.AppSettings["Key_ReportServer"]);
}

构建参数化报表

有些报表需要参数,您通过开始日期、年份、结束日期等详细说明要显示的信息。我通常使用 SQL Server 存储过程来驱动报表,因为我可以更改后端 SQL 逻辑,而无需麻烦地上传和更改报表。

下面是一个非常简单的存储过程,用于获取指定年份的订单数量 (Order Qty)。SQL 语句包含在内供参考。

CREATE PROCEDURE usp_SalesQty
@Year as int
AS
select * from Ord_Qty
Where YearInt = @Year
GO

我将其放入一个简单的报表中,该报表按月份和年份显示一个表格以及一个 Qty 值。我还将图表放在报表上以显示按月份的销售数量。我已经将 Report5.rdl 上传到我的 Reporting Services 服务器,并在一个测试目录中调用它。请注意,当使用上述存储过程创建报表时,它会自动将参数 @Year 提取为报表参数。

我有两种方法可以在网页上查看报表:将报表详细信息输入到参数中,如上所示;或者使用代码来告诉 ReportViewer 组件在哪里查找报表。既然我们都是程序员,我将使用代码。

用代码更改报表

ReportViewer1.ServerUrl = 
     (ConfigurationSettings.AppSettings["Key_ReportServer"]);
ReportViewer1.ReportPath = "/test/Report5";

指定报表组件的 Parameters,设置 ServerUrlReportPath,报表将在生成并浏览时显示在屏幕上。您仍然需要像直接访问报表服务一样在参数字段中输入年份;这对用户来说有点粗糙。工具栏可见,我们将将其关闭,以便用户看不到它们。

ReportViewer1.Toolbar = 
  Microsoft.Samples.ReportingServices.ReportViewer.multiState.False;
ReportViewer1.Parameters = 
  Microsoft.Samples.ReportingServices.ReportViewer.multiState.False;

顶级技巧:您可以使用单个 ReportViewer 组件来显示多个报表。

集成 Web 组件

通过将下拉列表框放置在网页上并设置三个变量(2002、2003、2004),我们可以使用它来驱动报表参数。您需要确保在下拉列表控件上启用 autopostback

private void DropDownList1_SelectedIndexChanged(object sender, 
                                             System.EventArgs e)
{
   string param = "&Year=" + DropDownList1.SelectedValue;
   ReportViewer1.ReportPath = "/test/Report5" + param ;  
}

这里有一个更复杂的示例,它从日历控件和下拉列表框中提取日期信息。

string ReportPath = "/Reports/Invoice";
string param = "&Year=" + yearint + "&Month=" + monthint 
                              + "&Day=" + dayint + 
                              "&Cust=" Drop_Cust.SelectedValue;
ReportViewer1.ReportPath = ReportPath + param ;

开启切换工具栏

您还可以在页面上放置一个 Web 控件按钮来切换工具栏的开启和关闭。

private void Button1_Click(object sender, System.EventArgs e)
 {
    ReportViewer1.Toolbar = 
      Microsoft.Samples.ReportingServices.ReportViewer.multiState.False;
 }

页面视图

完整代码

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Configuration;

namespace ReportWeb
{
    /// <summary>
    /// Summary description for WebForm1.
    /// </summary>
    public class WebForm1 : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.DropDownList DropDownList1;
        protected System.Web.UI.WebControls.Button Button1;
        protected Microsoft.Samples.ReportingServices.ReportViewer ReportViewer1;
        
        private void Page_Load(object sender, System.EventArgs e)
        {
            // Put user code to initialize the page here
            
            if (!IsPostBack)
            {
              string param = "&Year=" + DropDownList1.SelectedValue;
              ReportViewer1.ReportPath = "/test/Report5" + param ;
              ReportViewer1.ServerUrl = 
                 (ConfigurationSettings.AppSettings["Key_ReportServer"]);
              ReportViewer1.Toolbar = 
                Microsoft.Samples.ReportingServices.ReportViewer.multiState.False;
              ReportViewer1.Parameters = 
                Microsoft.Samples.ReportingServices.ReportViewer.multiState.False;
            }
        }
        
        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: This call is required by the ASP.NET Web Form Designer.
            //
            InitializeComponent();
            base.OnInit(e);
        }
        
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        { 
            this.DropDownList1.SelectedIndexChanged += 
                new System.EventHandler(this.DropDownList1_SelectedIndexChanged);
            this.Button1.Click += new System.EventHandler(this.Button1_Click);
            this.Load += new System.EventHandler(this.Page_Load);
        }
        #endregion
        
        private void DropDownList1_SelectedIndexChanged(object sender, 
                                                           System.EventArgs e)
        {
            string param = "&Year=" + DropDownList1.SelectedValue;
            ReportViewer1.ReportPath = "/test/Report5" + param ;
        }
        
        private void Button1_Click(object sender, System.EventArgs e)
        {
            ReportViewer1.Toolbar = 
               Microsoft.Samples.ReportingServices.ReportViewer.multiState.False;
        }
    }
}

历史

  • V1.0 - 初始版本。
© . All rights reserved.