| 提要 本文试验将帮助你创建一个使用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”语句加入对装配集命名空间的引用声明。 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()方法中被执行代码的第一行。PopulateStockValuesArrayList();
从Build菜单下,点击Build Solution。如果你有任何构建错误现在就修改它们。从Debug菜单下,点击“Start Debugging”。如果这是你启动调试器的第一次,那么将出现一个对话框告诉你必须修改Web.config文件。点击OK按钮以启动调试功能。Default.aspx页面连同三个缺省值加载到你的浏览器中。关闭Internet Explorer窗口。 七、 练习5:把数据动态地添加到股票报告上 说明 在上一个练习中,你用编程方式填充对象集合。在本练习中,你将学习如何动态地从你的网站把信息添加到你的数据源。该信息能够在你的报表中得到自动更新。 详细步骤 1. 添加控件到Web表单。 
              在Design视图中打开Default.aspx文件。为了在Design视图中打开一个ASPX页面,首先打开文件,然后点击在该表单底部的Design按钮。 点击CrystalReportViewer控件来选择它。 按下左箭头键,以便出现闪烁的光标,并且按回车键从视图中往下移动四次。从工具箱中,把一个TextBox控件拖动到Web表单。从Property菜单下,把ID设置为symbol。 把第二个TextBox控件拖动到Web表单。把这第二个TextBox放到第一个下面。从Property菜单下,把ID设置为price。把第三个TextBox控件拖动到Web表单。把这第三个TextBox控件放到第二个下面。 从Property菜单下,把ID设置为volume。现在,你可以发现把文本添加在每一个文本框旁边极有助于标识哪个控件相应于哪个参数。 然后,从工具箱中,把一个按钮控件拖动Web表单上。把该按钮放到这三个TextBox控件下。从Property菜单下,把该按钮的ID设置为addStockInformation。把该按钮的Text设置为“Add Stock Information”。最后,双击“Add Stock Information” 按钮。双击按钮控件将打开Code-behind类并且自动生成一个addStockInformation_click()事件处理器。 2. 把信息添加到集合。 
              在addStockInformation_click()事件处理器中,创建并且实例化一个新的Stock对象。Stock temp = new Stock();
在addStockInformation_click()方法中,创建一个try/catch块。try
 {}
 catch
 {}
 输入到一个Web表单中的信息属于String类型。因为Stock类中的两个字段都是numerical型,所以你需要编写代码来把Web表单中的String值转换为numerical值。try/catch语句有助于保护你的web应用程序免于崩溃—在类型转换出现错误匹配期间。在Try块中,把在Web表单中的symbol字段的值赋值到Stock对象的Symbol属性。temp.Symbol = symbol.Text;
在下一行中,把在Web表单中的price字段的值赋值到Stock对象的Price属性。注意,在赋值之前,要把Web表单中的这个值转化为一个Double。temp.Price = Convert.ToDouble(price.Text);
然后,把在Web表单中的volume字段的值赋值到Stock对象的Volume属性。注意,在赋值之前,要把Web表单中的这个值转化为一个整数。temp.Volume = Convert.ToInt32(volume.Text);
在try/catch块的外面,把“Stock Object”添加到stockValues ArrayList。stockValues.Add(temp);
更新当前存在于Session中的stockValues的值。Session["stockValues"] = stockValues;
最后,调用ConfigureCrystalReports()方法。这将把报告重新绑定到这个更新过的stockValues—一个对象集合。ConfigureCrystalReports(); 
              从Build菜单下,点击“Build Solution”。如果你遇到任何构建错误,则现在就修改。从Debug菜单下,点击“Start Debugging”。如果没有出现构建错误,Default.aspx页面将使用三个缺省值加载到你的浏览器。为了添加其它值,适当地填充文本框并且点击“Add 
                Stock Information”按钮。报告将会被动态地更新。当你运行你的网站时,报告将装载到你的浏览器窗口中—使用三个缺省值(你是在练习4中以编程方式添加的)。在报告上面共有三个TextBox控件和一个按钮控件。使用这些控件,你可以动态地更新你的一个对象集合,并且看到这一更新的结果会反映到你的报告中。关闭Internet Explorer窗口。 八、 练习6:在报告中添加图表和摘要信息 说明 至此,你已经拥有一个全功能的网站,它将显示一个基于一个对象集合的水晶报表。该站点将显示以编程方式输入到一个对象集合中的信息,以及在运行时刻被动态地添加的信息。 在这个练习中,你将添加两个图表,一个calculated字段和摘要信息。 详细步骤 1. 把一个图表添加到报告中。 
              从solution explorer下,打开StockObjects.rpt。从Crystal Reports菜单下,选择Insert,并且点击Chart。在“Chart Expert”对话框中,选择一个Pie图。选择Data选项卡。选择Stock.Symbol并且点击最右方向箭头以把Stock.Symbol字段移动到“On Change Of”字段。 选择Stock.Volume并且点击最右方向箭头以把Stock.Volume字段移动到Show Value(s)字段。 点击OK。创建一个新的“Report Header”节,并且把一个图表对象添加到这一节中。从Debug菜单下,点击“Start Debugging”。 如果不出现构建错误,那么Default.aspx页面将加载到你的浏览器中。关闭Internet Explorer窗口。 2. 添加一个基于一个formula字段的图表。在这一节中,你将创建一个显示合计信息的图表。首先,你将创建一个公式以计算一个特定的持股值,然后创建一个饼图—它显示你的所有持股值的比例值。 
              从Crystal Reports菜单下,选择Report,并且点击“Formula Workshop”。在“Formula Workshop”对话框中,选择“Formula Fields”。点击New按钮创建一个新公式。在“Formula Name”对话框中,输入值。点击“Use Editor”。 添加代码以把price字段值与volume字段值相乘。{Stock.Volume}*{Stock.Price}
点击Save并关闭。 从Crystal Reports菜单下,选择Insert并且点击Chart。在“Chart Expert”对话框下,选择一个Pie图。点击Data选项卡。选择Stock.Symbol并且点击最右方向箭头把Stock.Symbol字段移动到“On Change Of”字段。选择Worth并且点击最右方向箭头把Worth公式移动到“Show Value(s)”字段。点击Text选项卡。在Title旁边,清除“Auto-text”复选框。在Title字段中输入Worth/Symbol。点击OK。一个新的Report Header节被创建,并且有一个Chart对象被添加到这一节上。为了重新放置在一个水晶报表中的对象的位置,你可以用鼠标拖动之并把它们放在任何你想放置的位置。你可以使用在表单底部的“Main 
                Report Preview“按钮来显示你的报告的一个预览。 3. 把Formula和Summary字段添加到你的报告中。在这一节中,你添加一个formula字段到你的报告,还有一个摘要字段—它来计算你的portfolio的总值。 
              展开Field Explorer的“Formula Fields”结点。把worth公式拖动到你的报告。把这个字段放到你的报告的节中。如果“Field Explorer”不可见,从View菜单下选择“Document Outline”。这个字段将显示每一行的值。使用一个summary字段显示你的portfolio的总值。从“Crystal Reports”菜单下,选择“Insert”,点击“Summary”。“Insert Summary”对话框出现。从“Choose the Field to Summarize”字段下选择Worth公式。从“Calculate this Summary”字段下选择“Sum”。从“Summary Location”字段下选择“Grand Total”。点击OK。把一个摘要字段添加到报告中。
从“Debug”菜单下,点击“Start Debugging”。如果没有出现构建错误,Default.aspx页面将加载到你的浏览器。关闭Internet Explorer窗口。 4. 添加一个前面已经存在的报告。在这一节中,你将让你的Web应用程序使用一个位于你的文件系统中的现有报告。 
              右击Solution Explorer中的StockObjects.rpt。点击Delete。点击弹出的对话框中的OK。在Solution Explorer中,右击加粗的网站名,然后点击“Add Existing Item”。在“Add Existing Item”对话框中,导航到“C:\Microsoft Hands-On-Lab\HOL-ILL05\Source\Excercises”,并选择StockObjects.rpt文件。点击Add。从Debug菜单下,点击“Start Debugging”。如果没有出现构建错误,那么Default.aspx page将加载到你的浏览器中并且显示你的新报告。关闭Internet Explorer窗口。     |