提要 本文试验将帮助你创建一个使用Crystal Report的Web应用程序—报告中的数据来源于一个对象集合,你将创建一个专门的类来保存股票市场数据。
一、 开发目标
结束本试验后,你将能够更好地:
· 创建一个专门的类来保存股票市场值。
· 实例化这个类。
· 使用数据填充一个对象集合。
· 通过一个web表单动态地添加数据。
· 使用Crystal Report Designer熟练地创建一个水晶报表。
二、 内容说明
本实验将引导你创建一个Crystal Reports web应用程序—报告中的数据来源于一个对象集合。该应用程序是用Crystal Reports for Visual Studio 2005 Beta 2进行开发成功。
然后,你将创建一个专门的类来保存股票市场值,实例化该类并使用数据填充一个对象集合,并且通过一个web表单进一步动态地添加数据。然后,你将创建一个水晶报表,通过使用Crystal Report Designer控件—它连接到对象集合并且动态地生成一个图表和股票摘要信息。
三、 练习一:Web应用程序安装
说明 在本练习中,你将创建一个新的网站,并且应用标准设置来完成此练习。
详细步骤
1. 在Visual Studio中创建一个新的ASP.NET Web站点。
· 双击桌面上的Visual Studio 2005 Beta 2快捷方式。
· 点击“文件|新建|网站”。
· 在“新建网站”对话中,点击“ASP.NET 网站”。
· 在“位置”列表中,选择“文件系统”。
· 在“语言”列表中,选择“Visual C#”。
· 在“位置”文本域中,接受默认的路径和名称。
· 点击OK。
2. 添加Crystal Report Viewer 控件。
· 从Solution Explorer中,双击Default.aspx以打开该web表单。
· 点击在该表单底部的“设计”按钮来把Web表单改变到设计视图。
· 从工具栏中,展开Crystal Reports结点并且定位到CrystalReportViewer控件。
· 把CrystalReportViewer控件拖动到该Web表单。
· 如果“Smart Task”面板上的“CrystalReportViewer Tasks”被打开,则按下Esc键关闭它。
· “Smart Task”面板是Visual Studio 2005中的一个新特征—允许用较少的代码来创建工程。在这个选项卡中,你将使用一种编程方式,因此不必使用“Smart Task”面板。
· 点击Properties选项卡并且选择CrystalReportViewer。
· 从Properties窗口中,把ID属性设置为crystalReportViewer。
· 从文件菜单下,点击SaveAll。
3. 添加编程环境。
· 点击Solution Explorer选项卡。
· 在Solution Explorer中,右击Default.aspx并且点击“View Code”。
· 在类签名的上面,使用“using”语句加入对装配集命名空间的引用声明。
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
· 在这个类中,添加一个新的private型且无返回值的助理方法ConfigureCrystalReports()。
private void ConfigureCrystalReports()
{}
· ConfigureCrystalReports()是一个助理方法—它负责在运行时刻与报告交互。它还负责以编程方式与报告进行交互。为了正确地配置CrystalReportViewer,必须从中Page_Init()调用它。
· 使用显示的适当语法添加Page_Init事件处理器。
private void Page_Init(object sender, EventArgs e)
{}
· 在Visual Studio 2005的一个C# Web表单中,在code-behind类中的Page_Init事件处理器是被自动地依附到Init事件的。这个事件处理器签名必须正确匹配以便进行调用。
· 最后,在Page_Init事件处理器中,加入对ConfigureCrystalReports()助理方法的调用。
ConfigureCrystalReports();
· 从文件菜单下,点击“Save All”。
· 现在,你已经准备好创建你的定制股票市场信息类了。
四、 练习2:创建一个定制的股票市场信息
说明 在本练习中,你要创建一个定制的类来保存股票市场信息。这个类将用于填充一个对象集合。
详细步骤
· 在Solution Explorer中,右击粗体的网站名,然后点击“Add New Item”。
· 然后,出现“Add New Item ”对话框。
· 在Visual Studio“Installed Templates”域中,选择“Class”。
· 在Name字段中,输入Stock,然后点击Add。
· 在随后出现的对话框中点击Yes。
· 在Visual Studio 2005中,所有的类必须被放置到一个App Code文件夹下,如果要使用它们的话。当你点击Add按钮时,将出现一个警告对话框问你是否想把你的类放到这个App_Code文件夹下。
· 本文中的Stock类必须被设置为public类,以便当你创建报告时存取它。请一定要确保你创建的类是public型。
public class Stock
{
public Stock()
{}
}
· 在这个类中,加入三个private字段。
private string _symbol;
private double _price;
private int _volume;
· 然后,你将把三个public读/写属性加入以封装这三个private字段。
· 创建一个新的属性,命名为Symbol。
public string Symbol
{
get
{
return _symbol;
}
set
{
_symbol = value;
}
}
· 创建一个新的属性,命名为Price。
public double Price
{
get
{
return _price;
}
set
{
_price = value;
}
}
· 创建一个新的属性,命名为Volume。
public int Volume
{
get
{
return _volume;
}
set
{
_volume = value;
}
}
· 最后,创建一个新的构造器,它使用三个public属性作为参数。
public Stock (String symbol, int volume, double price)
{
_symbol = symbol;
_volume = volume;
_price = price;
}
· 从Build菜单下,点击“Build Website”。
· 如果你有任何构建错误现在就修改它们。
· 现在,你已经准备好从内置的Crystal Report Designer中存取这个对象了。
五、 练习3:创建一个水晶报表
说明 在本练习中,你将在内置的Crystal Report Designer中创建一个新的Crystal report,然后把这个报告绑定到Stock对象。
详细步骤
· 右击网站名并且点击“Add New Item”。
· 在“Add New Item” 对话框中,选择“Crystal Report”。
· 在Name字段中,输入StockObjects.rpt,然后点击Add。
· 在“Crystal Reports Gallery”对话框中,点击OK。
· 在“Standard Report Creation Wizard”对话框中,展开“Project Data”及子结点“.NET Objects”。
· 将出现该工程中的一个类列表。
· 展开Stock类来观察一个可选择的子结点。
· 点击向右的箭头,以便把“Stock”类子结点移动到“Selected Tables”面板上。
· 点击Next。
· 展开Stock并且点击“>>”以便把所有的列移动到“Fields to Display”面板上。
· 点击Next。
· 选择Symbol并且点击向右的箭头来把它移动到“Group By”面板上。
· 点击Finish。
六、 练习4:把你的水晶报表绑定到Crystal Report Viewer
说明 在这个练习中,你将把Stock对象报告绑定到Crystal Report Viewer,把报告的数据源设置为一个对象集合,并且用编程方式来填充一个对象集合。
详细步骤
1. 把报告绑定到Crystal Report Viewer。
· 切换到默认的Code-Behind类,Default.aspx.cs。
· 在类签名之上,加入对命名空间System.Collections的引用。
using System.Collections;
· 这个参考使你能够存取ArrayList类,而ArrayList实现了ICollection。这使得ArrayList成为用来构建一个为Crystal Reports所识别的对象集合的若干类的类型之一。
· 添加一个新的类级别的ArrayList,命名为stockValues。
private ArrayList stockValues;
· 为ReportDocument报告包装类添加一个新的类级别的声明,变量名为stockObjectsReport。并把它设置为private型。
private ReportDocument StockObjectsReport;
· 在你在练习1创建的ConfigureCrystalReports()方法中,声明一个字符串变量,命名它为reportPath,并且把一个指向本地报告的运行时刻路径赋值给它。把本地报告文件的名字作为一个字符串参考传递给Server.MapPath()方法。这样以来,把本地报告映射到运行时刻文件路径。
String reportPath = Server.MapPath("StockObjects.rpt");
· 实例化ReportDocument类。
StockObjectsReport = new ReportDocument();
· 在下一行中,调用ReportDocument实例的Load()方法,并且把reportPath字符串变量传递给它。
StockObjectsReport.Load(reportPath);
· 这个ReportDocument类是CrystalDecisions.CrystalReports。Engine命名空间的一个成员。你已经在“练习1: Web应用程序安装”中添加了对这个命名空间的声明(在C#中是使用“using”)。当你实例化ReportDocument并且加载一个报告时,你可以通过SDK来存取这个报告。
· 然后,把这个报告的数据源设置为“stockValues ArrayList”。
StockObjectsReport.SetDataSource(stockValues);
· 最后,把CrystalReportViewer的ReportSource属性绑定到ReportDocument实例。
crystalReportViewer.ReportSource = stockObjectsReport;
l. 现在,这个Stock对象报告被绑定到Crystal Report Viewer并且页面显示正确的报告;然而,当前的报告被绑定到一个空数据源上,因此报告中没有要显示的信息。在下一步中,你将用样本数据以编程方式填充stockValues ArrayList。
2. 以编程方式填充一个对象集合。
3. 在这个任务中,你将把Session代码添加到ASPX code-behind类。如果在session中没有值,将会生成默认值。如果session中有值,它们将被赋值到stockValues ArrayList中。
· 在这个类中,添加一个新的public范围的不具有返回值的助理方法,命名为PopulateStockValuesArrayList()。
public void PopulateStockValuesArrayList()
{}
· 在PopulateStockValuesArrayList()方法中,在现有代码前,创建一个if/else条件块—它检查是否存在一个名为stockValues的Session对象。
if(Session["stockValues"] == null)
{}
else
{}
· 在这个If块中,实例化一个新的ArrayList()。
stockValues = new ArrayList();
· 然后,使用Stock类的重载构造器来创建和实例化Stock的三个实例。
Stock s1 = new Stock("AWRK",1200,28.47);
Stock s2 = new Stock("CTSO",800,128.69);
Stock s3 = new Stock("LTWR",1800,12.95);
· 把这三个实例添加到stockValues。
stockValues.Add(s1); stockValues.Add(s2); stockValues.Add(s3);
· 把更新的stockValues ArrayList添加到session中。
Session["stockValues"]=stockValues;
· 在Else块中,加入一行代码以便把session中的当前值赋给stockValues ArrayList。
stockValues = (ArrayList)Session["stockValues"];
· 最后,从ConfigureCrystalReports()方法中调用PopulateStockValuesArrayList()。
· 这应该是ConfigureCrystalReports()方法中被执行代码的第一行。
Po