提要 本文试验将帮助你创建一个使用Crystal Report的Web应用程序—报告中的数据来源于一个对象集合
你将创建一个专门的类来保存股票市场数据
一 开发目标
结束本试验后你将能够更好地
· 创建一个专门的类来保存股票市场值
· 实例化这个类
· 使用数据填充一个对象集合
· 通过一个web表单动态地添加数据
· 使用Crystal Report Designer熟练地创建一个水晶报表
二 内容说明
本实验将引导你创建一个Crystal Reports web应用程序—报告中的数据来源于一个对象集合该应用程序是用Crystal Reports for Visual Studio Beta 进行开发成功
然后你将创建一个专门的类来保存股票市场值实例化该类并使用数据填充一个对象集合并且通过一个web表单进一步动态地添加数据然后你将创建一个水晶报表通过使用Crystal Report Designer控件—它连接到对象集合并且动态地生成一个图表和股票摘要信息
三 练习一Web应用程序安装
说明 在本练习中你将创建一个新的网站并且应用标准设置来完成此练习
详细步骤
在Visual Studio中创建一个新的ASPNET Web站点
· 双击桌面上的Visual Studio Beta 快捷方式
· 点击文件|新建|网站
· 在新建网站对话中点击ASPNET 网站
· 在位置列表中选择文件系统
· 在语言列表中选择Visual C#
· 在位置文本域中接受默认的路径和名称
· 点击OK
添加Crystal Report Viewer 控件
· 从Solution Explorer中双击Defaultaspx以打开该web表单
· 点击在该表单底部的设计按钮来把Web表单改变到设计视图
· 从工具栏中展开Crystal Reports结点并且定位到CrystalReportViewer控件
· 把CrystalReportViewer控件拖动到该Web表单
· 如果Smart Task面板上的CrystalReportViewer Tasks被打开则按下Esc键关闭它
· Smart Task面板是Visual Studio 中的一个新特征—允许用较少的代码来创建工程在这个选项卡中你将使用一种编程方式因此不必使用Smart Task面板
· 点击Properties选项卡并且选择CrystalReportViewer
· 从Properties窗口中把ID属性设置为crystalReportViewer
· 从文件菜单下点击SaveAll
添加编程环境
· 点击Solution Explorer选项卡
· 在Solution Explorer中右击Defaultaspx并且点击View Code
· 在类签名的上面使用using语句加入对装配集命名空间的引用声明
· ConfigureCrystalReports()是一个助理方法—它负责在运行时刻与报告交互它还负责以编程方式与报告进行交互为了正确地配置CrystalReportViewer必须从中Page_Init()调用它
· 使用显示的适当语法添加Page_Init事件处理器
private void Page_Init(object sender EventArgs e)
{}
· 在Visual Studio 的一个C# Web表单中在codebehind类中的Page_Init事件处理器是被自动地依附到Init事件的这个事件处理器签名必须正确匹配以便进行调用
· 最后在Page_Init事件处理器中加入对ConfigureCrystalReports()助理方法的调用
ConfigureCrystalReports();
· 从文件菜单下点击Save All
· 现在你已经准备好创建你的定制股票市场信息类了
四 练习:创建一个定制的股票市场信息说明 在本练习中你要创建一个定制的类来保存股票市场信息这个类将用于填充一个对象集合
详细步骤
· 在Solution Explorer中右击粗体的网站名然后点击Add New Item
· 然后出现Add New Item 对话框
· 在Visual StudioInstalled Templates域中选择Class
· 在Name字段中输入Stock然后点击Add
· 在随后出现的对话框中点击Yes
· 在Visual Studio 中所有的类必须被放置到一个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中存取这个对象了
五 练习:创建一个水晶报表说明 在本练习中你将在内置的Crystal Report Designer中创建一个新的Crystal report然后把这个报告绑定到Stock对象
详细步骤
· 右击网站名并且点击Add New Item
· 在Add New Item 对话框中选择Crystal Report
· 在Name字段中输入StockObjectsrpt然后点击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
六 练习:把你的水晶报表绑定到Crystal Report Viewer
说明 在这个练习中你将把Stock对象报告绑定到Crystal Report Viewer把报告的数据源设置为一个对象集合并且用编程方式来填充一个对象集合
详细步骤
把报告绑定到Crystal Report Viewer
· 切换到默认的CodeBehind类Defaultaspxcs
· 在类签名之上加入对命名空间SystemCollections的引用
using SystemCollections;
· 这个参考使你能够存取ArrayList类而ArrayList实现了ICollection这使得ArrayList成为用来构建一个为Crystal Reports所识别的对象集合的若干类的类型之一
· 添加一个新的类级别的ArrayList命名为stockValues
private ArrayList stockValues;
· 为ReportDocument报告包装类添加一个新的类级别的声明变量名为stockObjectsReport并把它设置为private型
private ReportDocument StockObjectsReport;
· 在你在练习创建的ConfigureCrystalReports()方法中声明一个字符串变量命名它为reportPath并且把一个指向本地报告的运行时刻路径赋值给它把本地报告文件的名字作为一个字符串参考传递给ServerMapPath()方法这样以来把本地报告映射到运行时刻文件路径
String reportPath = ServerMapPath(StockObjectsrpt);
· 实例化ReportDocument类
StockObjectsReport = new ReportDocument();
· 在下一行中调用ReportDocument实例的Load()方法并且把reportPath字符串变量传递给它
StockObjectsReportLoad(reportPath);
· 这个ReportDocument类是CrystalDecisionsCrystalReportsEngine命名空间的一个成员你已经在练习: Web应用程序安装中添加了对这个命名空间的声明(在C#中是使用using)当你实例化ReportDocument并且加载一个报告时你可以通过SDK来存取这个报告
· 然后把这个报告的数据源设置为stockValues ArrayList
StockObjectsReportSetDataSource(stockValues);
· 最后把CrystalReportViewer的ReportSource属性绑定到ReportDocument实例
crystalReportViewerReportSource = stockObjectsReport;
l 现在这个Stock对象报告被绑定到Crystal Report Viewer并且页面显示正确的报告然而当前的报告被绑定到一个空数据源上因此报告中没有要显示的信息在下一步中你将用样本数据以编程方式填充stockValues ArrayList
以编程方式填充一个对象集合
在这个任务中你将把Session代码添加到ASPX codebehind类如果在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 s = new Stock(AWRK);
Stock s = new Stock(CTSO);
Stock s = new Stock(LTWR);
· 把这三个实例添加到stockValues
stockValuesAdd(s); stockValuesAdd(s); stockValuesAdd(s);
· 把更新的stockValues ArrayList添加到session中
Session[stockValues]=stockValues;
· 在Else块中加入一行代码以便把session中的当前值赋给stockValues ArrayList
stockValues = (ArrayList)Session[stockValues];
· 最后从ConfigureCrystalReports()方法中调用PopulateStockValuesArrayList()
· 这应该是ConfigureCrystalReports()方法中被执行代码的第一行
PopulateStockValuesArrayList();
· 从Build菜单下点击Build Solution
· 如果你有任何构建错误现在就修改它们
· 从Debug菜单下点击Start Debugging
· 如果这是你启动调试器的第一次那么将出现一个对话框告诉你必须修改nfig文件点击OK按钮以启动调试功能
· Defaultaspx页面连同三个缺省值加载到你的浏览器中
· 关闭Internet Explorer窗口
七 练习:把数据动态地添加到股票报告上说明 在上一个练习中你用编程方式填充对象集合在本练习中你将学习如何动态地从你的网站把信息添加到你的数据源该信息能够在你的报表中得到自动更新
详细步骤
添加控件到Web表单
· 在Design视图中打开Defaultaspx文件
· 为了在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 按钮
· 双击按钮控件将打开Codebehind类并且自动生成一个addStockInformation_click()事件处理器
把信息添加到集合
· 在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属性
tempSymbol = symbolText;
· 在下一行中把在Web表单中的price字段的值赋值到Stock对象的Price属性注意在赋值之前要把Web表单中的这个值转化为一个Double
tempPrice = ConvertToDouble(priceText);
· 然后把在Web表单中的volume字段的值赋值到Stock对象的Volume属性注意在赋值之前要把Web表单中的这个值转化为一个整数
tempVolume = ConvertToInt(volumeText);
· 在try/catch块的外面把Stock Object添加到stockValues ArrayList
stockValuesAdd(temp);
· 更新当前存在于Session中的stockValues的值
Session[stockValues] = stockValues;
· 最后调用ConfigureCrystalReports()方法这将把报告重新绑定到这个更新过的stockValues—一个对象集合
ConfigureCrystalReports();
· 从Build菜单下点击Build Solution
· 如果你遇到任何构建错误则现在就修改
· 从Debug菜单下点击Start Debugging
· 如果没有出现构建错误Defaultaspx页面将使用三个缺省值加载到你的浏览器为了添加其它值适当地填充文本框并且点击Add Stock Information按钮报告将会被动态地更新
· 当你运行你的网站时报告将装载到你的浏览器窗口中—使用三个缺省值(你是在练习中以编程方式添加的)在报告上面共有三个TextBox控件和一个按钮控件使用这些控件你可以动态地更新你的一个对象集合并且看到这一更新的结果会反映到你的报告中
· 关闭Internet Explorer窗口
八 练习:在报告中添加图表和摘要信息说明 至此你已经拥有一个全功能的网站它将显示一个基于一个对象集合的水晶报表该站点将显示以编程方式输入到一个对象集合中的信息以及在运行时刻被动态地添加的信息
在这个练习中你将添加两个图表一个calculated字段和摘要信息
详细步骤
把一个图表添加到报告中
· 从solution explorer下打开StockObjectsrpt
· 从Crystal Reports菜单下选择Insert并且点击Chart
· 在Chart Expert对话框中选择一个Pie图
· 选择Data选项卡
· 选择StockSymbol并且点击最右方向箭头以把StockSymbol字段移动到On Change Of字段
· 选择StockVolume并且点击最右方向箭头以把StockVolume字段移动到Show Value(s)字段
· 点击OK
· 创建一个新的Report Header节并且把一个图表对象添加到这一节中
· 从Debug菜单下点击Start Debugging
· 如果不出现构建错误那么Defaultaspx页面将加载到你的浏览器中
· 关闭Internet Explorer窗口
添加一个基于一个formula字段的图表在这一节中你将创建一个显示合计信息的图表首先你将创建一个公式以计算一个特定的持股值然后创建一个饼图—它显示你的所有持股值的比例值
· 从Crystal Reports菜单下选择Report并且点击Formula Workshop
· 在Formula Workshop对话框中选择Formula Fields
· 点击New按钮创建一个新公式
· 在Formula Name对话框中输入值
· 点击Use Editor
· 添加代码以把price字段值与volume字段值相乘
{StockVolume}*{StockPrice}
· 点击Save并关闭
· 从Crystal Reports菜单下选择Insert并且点击Chart
· 在Chart Expert对话框下选择一个Pie图
· 点击Data选项卡
· 选择StockSymbol并且点击最右方向箭头把StockSymbol字段移动到On Change Of字段
· 选择Worth并且点击最右方向箭头把Worth公式移动到Show Value(s)字段
· 点击Text选项卡
· 在Title旁边清除Autotext复选框
· 在Title字段中输入Worth/Symbol
· 点击OK
· 一个新的Report Header节被创建并且有一个Chart对象被添加到这一节上
· 为了重新放置在一个水晶报表中的对象的位置你可以用鼠标拖动之并把它们放在任何你想放置的位置你可以使用在表单底部的Main Report Preview按钮来显示你的报告的一个预览
把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
· 如果没有出现构建错误Defaultaspx页面将加载到你的浏览器
· 关闭Internet Explorer窗口
添加一个前面已经存在的报告在这一节中你将让你的Web应用程序使用一个位于你的文件系统中的现有报告
· 右击Solution Explorer中的StockObjectsrpt
· 点击Delete
· 点击弹出的对话框中的OK
· 在Solution Explorer中右击加粗的网站名然后点击Add Existing Item
· 在Add Existing Item对话框中导航到C:\Microsoft HandsOnLab\HOLILL\Source\Excercises并选择StockObjectsrpt文件
· 点击Add
· 从Debug菜单下点击Start Debugging
· 如果没有出现构建错误那么Defaultaspx page将加载到你的浏览器中并且显示你的新报告
· 关闭Internet Explorer窗口