使用ASP.NET 2.0中的ReportViewer控件
来源:互联网 发布:4钻淘宝店铺转让价格 编辑:程序博客网 时间:2024/04/30 18:52
介绍
任何数据驱动型的应用程序都有一个普遍的需求,那就是报表。 但是,在ASP.NET 1.x中并没有给我们提供这个非常重要的特性。 然而很幸运的是,伴随着.NET 2.0而来的ReportViewer控件可以满足你对报表的一些基本需求。 我将会在本文中向你演示如何使用这个控件。 ReportViewer控件既可以在web程序中使用,也可以在windows程序中使用。 在这里,我将只介绍如何在web程序中使用它。
报表示例
我们假设要生成一个如下所示的顾客信息列表:
上面的报表是一个非常简单的以国家分组的顾客信息列表。 报表的数据是从Northwind数据库的Customers表里获取的。 默认情况下,它会显示所有的顾客信息。 但是,你也可以让它显示属于你指定的某个国家的顾客信息。
该报表是使用ReportViewer控件设计的,它可以从强类型的DataSet中或者自定义的对象集合中获取数据。 在实际的程序开发中,我们往往会使用3层架构,数据的获取经常会是从业务层取得的DataSet或一个泛型集合。 在这里,我打算使用一个泛型集合作为数据源,而不是强类型的DataSet。
创建类库
首先,打开Visual Studio,然后创建一个名为ReportViewerLib的类库项目。 添加一个如下所示的名为Customer的类:
using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using System.Collections.Generic;
namespace ReportViewerLib
...{
public class Customer
...{
public string strCustomerID;
public string strCompanyName;
public string strContactName;
public string strCountry;
public string CustomerID
...{
get
...{
return strCustomerID;
}
set
...{
strCustomerID = value;
}
}
public string CompanyName
...{
get
...{
return strCompanyName;
}
set
...{
strCompanyName= value;
}
}
public string ContactName
...{
get
...{
return strContactName;
}
set
...{
strContactName= value;
}
}
public string Country
...{
get
...{
return strCountry;
}
set
...{
strCountry= value;
}
}
public static List<Customer> GetCustomersForCountry(string country)
...{
SqlConnection cnn=new SqlConnection(
ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString);
SqlCommand cmd=new SqlCommand();
cmd.Connection=cnn;
cmd.CommandText="select
CustomerID,CompanyName,ContactName,Country
from customers where country=@country";
SqlParameter p=new SqlParameter
("@country",country);
cmd.Parameters.Add(p);
cnn.Open();
SqlDataReader reader = cmd.ExecuteReader();
List<Customer> list = new List<Customer>();
while (reader.Read())
...{
Customer c = new Customer();
c.CustomerID = reader.GetString(0);
c.CompanyName = reader.GetString(1);
c.ContactName = reader.GetString(2);
c.Country = reader.GetString(3);
list.Add(c);
}
cnn.Close();
return list;
}
public static List<Customer> GetAllCustomers()
...{
SqlConnection cnn = new SqlConnection(
ConfigurationManager.ConnectionStrings
["NorthwindConnectionString"].ConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cmd.CommandText = "select
CustomerID,CompanyName,ContactName,Country from customers";
cnn.Open();
SqlDataReader reader = cmd.ExecuteReader();
List<Customer> list = new List<Customer>();
while (reader.Read())
...{
Customer c = new Customer();
c.CustomerID = reader.GetString(0);
c.CompanyName = reader.GetString(1);
c.ContactName = reader.GetString(2);
c.Country = reader.GetString(3);
list.Add(c);
}
cnn.Close();
return list;
}
}
}
创建数据源
设计报表的时候,需要在你的项目中为其指定一个数据源。 在你的项目中添加一个数据源可以这样做,选择“数据”菜单 -> 添加新数据源。 然后将会出现如下图所示的对话框:
你的数据源可以是数据库、web service或者是一个对象。 本例中我们选择的是对象。 然后单击“下一步”按钮,会弹出让我们选择数据源的界面。 我们选择的是Customer类(如下图所示)。
单击“完成”按钮后就完成了数据源配置向导。 这样,你就在你的类库中添加了一个新的数据源。 如果要查看数据源的话可以这么做,选择“数据”菜单 -> 显示数据源,就会出现如下图所示的界面:
设计报表
接下来添加一个报表。 右键单击项目,选择“添加新项”。 在对话框里选择“报表”,并单击“添加”按钮(如下图所示)。 这样,我们就添加了一个名为“Report1.rdlc”的文件。 .rdlc文件是一个报表文件,它保存的是报表布局和数据映射。
一旦你打开了Report1.rdlc文件,Visual Studio的工具箱里就会显示出一套与报表相关的控件(如下所示)。
这些控件中,“文本框”控件和“表”控件是非常常用的。 “文本框”控件用于显示一段静态文本或者是一个表达式。 “表”控件用于显示表格数据,其生成的结果会显示在你的报表的“主体”中。
设计出的报表如下图所示:
在报表的“页眉”部分的头部,有一个文本框,其Value属性的值为“Customer Listing”。 在这个文本框的下面还有另一个文本框,其Value属性的值为“=Parameters!SubTitle.Value”。它的意思就是指明文本框的值来自名为SubTitle的参数。 我们如何来定义参数呢? 这需要在报表的ReportParameters属性中添加参数。 打开的报表参数对话框如下图所示:
请注意:参数的设置是在我们的.NET代码中完成的。
如果要在报表上显示日期的话,只要设置相关的文本框的Value属性为“=FormatDateTime(ToDay(),DateFormat.ShortDate)”即可。 报表的一大优势就是有很多的内置函数,如ToDay()和FormatDateTime之类的。 本例中,我们使用FormatDateTime()函数来以ShortDate的格式显示当前的日期(ToDay())。
现在,从工具箱里拖拽一个“表”控件到你的报表上。 默认情况下,“表”控件有3行3列,3行分别是:表头、详细信息和表尾。 当然,你也可以为“表”控件添加行和列。 从数据源窗口中拖拽CustomerID、CompanyName、ContactName和Country属性到你的“表”控件的详细信息行上。 这样,系统将会自动地添加文本框,并设置其属性为=Fields!CustomerID.Value、=Fields!CompanyName.Value之类的。 此时,列头也会被自动地添加。 当然,你也可以根据你的需求做你需要的修改。
接下来,我们要按顾客所属的国家对记录进行分组。 右键单击详细信息行的边框,选择插入组(如下图所示)。
然后将会出现如下图所示的对话框:
在“排序”选项卡中选择“=Fields!Country.Value”作为表达式,选择“Ascending”作为排序方向。
就是这些东西,很简单吧。 这样,我们就完成了报表的设计。
新建一个名为“ReportViewerDemo”的web站点。 添加ReportViewerLib程序集的引用,这样该程序集就会拷贝到你的web站点的BIN目录下。 之后,把Report1.rdlc文件添加到你的web站点中。 在工具箱的“数据”选项卡中拖拽一个ReportViewer控件到你的Default.aspx页上, 打开ReportViewer控件的智能标记面板,在“选择报表”的下拉框中选择Report1.rdlc,如下图所示:
选择好报表文件后,系统会自动地添加一个TypeName属性为Customer的对象数据源控件。 你可以在对象数据源控件的配置向导中验证一下。
接下来,拖拽一个DropDownList控件到页的头部,并为其设置4个选项 – All、USA、UK和Brazil。 同时设置它的AutoPostBack属性为True。 然后,打开数据源控件的配置向导,设置“SELECT”操作为SelectCustomersForCountry()方法。
设置SelectCustomersForCountry()方法的country参数为DropDownList1的SelectedValue。
默认情况下,将在报表中显示所有顾客信息。 当你在DropDownList选择了一个国家的时候,报表中就会显示属于你所选择的国家的顾客信息。 要完成这样的功能,我们只需要处理DropDownList的SelectedIndexChanged事件。
protected void DropDownList1_SelectedIndexChanged
(object sender, EventArgs e)
...{
if (DropDownList1.SelectedValue == "All")
...{
ObjectDataSource1.SelectMethod = "GetAllCustomers";
ObjectDataSource1.SelectParameters.Clear();
ReportParameter param = new ReportParameter
("SubTitle", "List of all the customers");
ReportParameter[] p =...{ param };
ReportViewer1.LocalReport.SetParameters(p);
}
else
...{
ObjectDataSource1.SelectMethod = "GetCustomersForCountry";
ObjectDataSource1.SelectParameters[0].DefaultValue
= DropDownList1.SelectedValue;
ReportParameter param = new ReportParameter
("SubTitle", "List of customers for a country");
ReportParameter[] p =...{ param };
ReportViewer1.LocalReport.SetParameters(p);
}
}
(object sender, EventArgs e)
...{
if (DropDownList1.SelectedValue == "All")
...{
ObjectDataSource1.SelectMethod = "GetAllCustomers";
ObjectDataSource1.SelectParameters.Clear();
ReportParameter param = new ReportParameter
("SubTitle", "List of all the customers");
ReportParameter[] p =...{ param };
ReportViewer1.LocalReport.SetParameters(p);
}
else
...{
ObjectDataSource1.SelectMethod = "GetCustomersForCountry";
ObjectDataSource1.SelectParameters[0].DefaultValue
= DropDownList1.SelectedValue;
ReportParameter param = new ReportParameter
("SubTitle", "List of customers for a country");
ReportParameter[] p =...{ param };
ReportViewer1.LocalReport.SetParameters(p);
}
}
就是这些东西,很简单吧。 报表已经搞定了。 你可以运行一下Default.aspx页看看效果。 注意,ReportViewer控件已经内置了导出特性,它允许你把报表导出为Excel或PDF格式。 ReportViewer控件还很多的属性,你可以自己摸索一下。
总结
ASP.NET的ReportViewer控件提供了很多报表的基本功能。 在本文中,我们使用了对象数据源控件来开发一个报表。 我们创建了一个类库和一个数据源。 最后使用ReportViewer控件来显示报表。
- 使用ASP.NET 2.0中的ReportViewer控件
- 使用ASP.NET 2.0中的ReportViewer控件
- 使用ASP.NET 2.0中的ReportViewer控件
- 使用ASP.NET 2.0中的ReportViewer控件
- 使用ASP.NET 2.0中的ReportViewer控件
- [翻译]使用ASP.NET 2.0中的ReportViewer控件
- [翻译]使用ASP.NET 2.0中的ReportViewer控件
- ASP.NET 应用ReportViewer 控件
- ASP.NET服务器控件使用之Reportviewer 报表
- 使用ASP.NET 2.0中的GridView控件
- 使用ASP.NET 2.0中的GridView控件
- 使用ASP.NET 2.0中的GridView控件
- 使用ASP.NET 2.0中的GridView控件
- 使用ASP.NET 2.0中的GridView控件
- 使用ASP.NET 2.0中的GridView控件
- 在Asp.net(C#) 中使用 ReportViewer
- SQL报表服务 - ReportViewer控件 + ASP.NET + 日历控件问题
- ASP.NET 中的上传控件 使用
- C++ —— STL容器分析(2)
- 2.22 Java notes - Enumeration Classes
- 网页的位置编程
- 还有多少程序员可以疯狂
- [翻译]在asp.net 2.0中使用WebParts
- 使用ASP.NET 2.0中的ReportViewer控件
- Java1.6.0实现系统托盘技术
- va_list是一个宏,由va_start和va_end界定,一时难说清,详细见《Windows32程序设计》Unicode部分
- 在面对级联关联(one-to-many......)查询的时候,你是怎么解决hibernate session关闭的?我是这样做的。
- SQL Server 2005 Integration Services (SSIS)数据源之Sybase
- 论坛里比较有趣的题目收集
- sql分页
- 对张孝祥JAVA就业指导关于RandomAccessFile用法例子的小小改写
- 除Google 以外的十七个搜索引擎创新