VS2005+Crystal Report开发Web应用

简介:
提要 本文试验将帮助你创建一个使用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()方法中被执行代码的第一行。

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窗口。













本文转自朱先忠老师51CTO博客,原文链接: http://blog.51cto.com/zhuxianzhong/59858,如需转载请自行联系原作者



相关文章
|
20天前
|
存储 监控 安全
如何在Python Web开发中确保应用的安全性?
如何在Python Web开发中确保应用的安全性?
|
23天前
|
前端开发 JavaScript
探索现代Web应用的微前端架构
【10月更文挑战第40天】在数字时代的浪潮中,Web应用的发展日益复杂多变。微前端架构作为一种新兴的设计理念,正逐步改变着传统的单一前端开发模式。本文将深入探讨微前端的核心概念、实现原理及其在实际项目中的应用,同时通过一个简单的代码示例,揭示如何将一个庞大的前端工程拆分成小而美的模块,进而提升项目的可维护性、可扩展性和开发效率。
|
1天前
|
Kubernetes 安全 Devops
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
18 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
|
7天前
|
前端开发 安全 JavaScript
2025年,Web3开发学习路线全指南
本文提供了一条针对Dapp应用开发的学习路线,涵盖了Web3领域的重要技术栈,如区块链基础、以太坊技术、Solidity编程、智能合约开发及安全、web3.js和ethers.js库的使用、Truffle框架等。文章首先分析了国内区块链企业的技术需求,随后详细介绍了每个技术点的学习资源和方法,旨在帮助初学者系统地掌握Dapp开发所需的知识和技能。
2025年,Web3开发学习路线全指南
|
14天前
|
存储 前端开发 JavaScript
如何在项目中高效地进行 Web 组件化开发
高效地进行 Web 组件化开发需要从多个方面入手,通过明确目标、合理规划、规范开发、加强测试等一系列措施,实现组件的高效管理和利用,从而提高项目的整体开发效率和质量,为用户提供更好的体验。
24 7
|
14天前
|
前端开发 JavaScript UED
在数字化时代,Web 应用性能优化尤为重要。本文探讨了CSS与HTML在提升Web性能中的关键作用及未来趋势
在数字化时代,Web 应用性能优化尤为重要。本文探讨了CSS与HTML在提升Web性能中的关键作用及未来趋势,包括样式表优化、DOM操作减少、图像优化等技术,并分析了电商网站的具体案例,强调了技术演进对Web性能的深远影响。
21 5
|
17天前
|
机器学习/深度学习 人工智能 JavaScript
JavaScript和TypeScript的未来发展趋势及其在Web开发中的应用前景
本文探讨了JavaScript和TypeScript的未来发展趋势及其在Web开发中的应用前景。JavaScript将注重性能优化、跨平台开发、AI融合及WebAssembly整合;TypeScript则强调与框架整合、强类型检查、前端工程化及WebAssembly的深度结合。两者结合发展,特别是在Vue 3.0中完全采用TypeScript编写,预示着未来的Web开发将更加高效、可靠。
31 4
|
18天前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
|
24天前
|
缓存 安全 网络安全
HTTP/2与HTTPS在Web加速中的应用
HTTP/2与HTTPS在Web加速中的应用
|
17天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
31 2