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





4.00/5 (10投票s)
2005 年 8 月 31 日
5分钟阅读

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 添加到我们的新项目中。
- 打开示例中的 ReportViewer 文件夹,然后浏览到 cs(适用于 C# 版本)。
- 双击或打开 ReportViewer.sln(即在 Visual Studio 中打开 ReportView 解决方案)。
- 构建解决方案。
- 关闭项目。
Visual Studio 现在会创建几个额外的目录,包括一个 bin 目录,其中包含 ReportViewer.dll 的调试版本(如果您愿意,可以更改生成类型以生成发布版本)。
配置 VS 以使用 Report Viewer
现在您可以将 ReportViewer.dll 添加到您的 Web 项目中以查看报表。
- 将 ReportViewer.dll 复制到您的 bin 目录或您的 Web 项目中。
- 在“解决方案资源管理器”中:右键单击“引用”,选择“添加引用”,然后转到“项目”选项卡,浏览并选择您 bin 目录中的 ReportViewer.dll。
- 现在将 ReportViewer 文档添加到工具箱:右键单击“工具箱”,选择“添加/删除项”,浏览到 bin 目录并选择 ReportViewer.dll。
您的 Visual Studio 工具箱中应该会出现 ReportViewer
。
在网页上显示简单的 Report Viewer
这是最简单的一步,将 ReportViewer
从工具箱拖到您的网页上。
现在,我们需要告诉 ReportView 在哪里查找报表。右键单击以查看 ReportViewer
的属性。
如上所示,我已经设置了 ServerUrl
和 ReportPath
。这将显示报表,就像在报表服务器的默认网页上显示一样,只不过它被封装在一个 ASP.NET 网页中。除非您指定了报表的 ServerURL
和 ReportPath
,否则该组件不允许您更改网页上报表的大小和高度。
有用参数
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
,设置 ServerUrl
和 ReportPath
,报表将在生成并浏览时显示在屏幕上。您仍然需要像直接访问报表服务一样在参数字段中输入年份;这对用户来说有点粗糙。工具栏可见,我们将将其关闭,以便用户看不到它们。
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 - 初始版本。