社区编辑申请
注册/登录
实例讲解:ASP.NET水晶报表教程
开发 后端
本文以一个三层结构的ASP.NET程序为例,介绍如何使用crystalreport来制作一份报表的ASP.NET水晶报表教程,其中着重介绍用ASP.NET水晶报表创建图表的技巧。

报表是应用程序中不可缺少的部分,一张好的报表,能直观地让人把握数据的情况,对决策起到重要作用。那么,如果才能更快捷、更高效地实现报表呢?本文以一个三层结构的ASP.NET程序为例,介绍如何使用crystalreport,来制作一份报表,其中介绍了不少ASP.NET水晶报表的技巧。

在这个例子中,我们设想的应用要为一个销售部门制作一份报表,管理者可以查看某段时间之内的销售情况,以列表或者折线图的形式反映出销售的趋势。我们将使用SQLServer 2000做为数据库,使用VB.NET编写中间层逻辑层,而前端的表示层使用C#。

介绍ASP.NET水晶报表教程之前,我们先来看下数据库的结构。

实例讲解:ASP.NET水晶报表教程之数据库结构

其中,tbitem表中存放的是每张订单中所订购的货品,tbsales存放的是每张订单,tblsalesperson是销售员表,存放该出版社的每位销售员。

接下来,使用SQLServer 2000来创建这些表。表的结构如下所示:

  1. CREATETABLE[dbo].[tblItem](  
  2. [ItemId][int]NOTNULL,  
  3. [Description][varchar](50)NOTNULL  
  4. )ON[PRIMARY]  
  5. CREATETABLE[dbo].[tblSalesPerson](  
  6. [SalesPersonId][int]NOTNULL,  
  7. [UserName][varchar](50)NOTNULL,  
  8. [Password][varchar](30)NOTNULL  
  9. )ON[PRIMARY]  
  10. CREATETABLE[dbo].[tblSales](  
  11. [SaleId][int]IDENTITY(1,1)NOTNULL,  
  12. [SalesPersonId][int]NOTNULL,  
  13. [ItemId][int]NOTNULL,  
  14. [SaleDate][datetime]NOTNULL,  
  15. [Amount][int]NOTNULL  
  16. )ON[PRIMARY

并且用以下的代码创建表之间的约束关系。

  1. ALTERTABLEtblItem  
  2. ADDCONSTRAINTPK_ItemId  
  3. PRIMARYKEY(ItemId)  
  4. GO  
  5. ALTERTABLEtblSalesPerson  
  6. ADDCONSTRAINTPK_SalesPersonId  
  7. PRIMARYKEY(SalesPersonId)  
  8. GO  
  9. ALTERTABLEtblSales  
  10. ADDCONSTRAINTFK_ItemId  
  11. FOREIGNKEY(ItemId)REFERENCEStblItem(ItemId)  
  12. GO  
  13. ALTERTABLEtblSales  
  14. ADDCONSTRAINTFK_SalesPersonId  
  15. FOREIGNKEY(SalesPersonId)REFERENCEStblSalesPerson(SalesPersonId)  
  16. GO 

ASP.NET水晶报表教程之创建中间逻辑层

在中间逻辑层组件中,我们为每一张表都创建两个类。比如,对于tblItems表,创建item和items类。Item类中记录每件销售的货品的详细情况,而items表则记录所有销售的货品并且有增加货品的方法。这样,就存在下面的六个类:

  Item and Items
  SalesPerson and SalesPersons
  Sale and Sales

接下来,看一下每个类中的属性:

Item类

包括如下属性
    ItemId (货品id编号)
    Description (货品的描述)
    Items

有一个方法,将根据item的编号返回一个item对象

    PublicFunctionGetAllItems()AsCollections.ArrayList

SalesPerson

该类有以下三个属性:
    SalesPersonId(销售员编号)
    Name(姓名)
    Password(密码)

SalesPersons

有一个方法,根据销售员登陆时输入的用户名和密码,在数据库中,验证销售员的登陆是否正确,如果正确,则返回零。

    PublicFunctionValidateUser(strUserNameasString,strPasswordasString)AsInteger

Sale

有如下5个属性
    SaleId
    SalesPersonId
    ItemId
    SaleDate
    Amount

Sales

有两个方法,其中getsales根据输入的参数返回sales对象的集合

    PublicFunctionGetSales(OptionalnSaleIdAsInteger=0,OptionalnSalesPersonIdAsInteger=0,OptionalnItemIdAsInteger=0)AsCollections.ArrayList

还有一个addsales方法,用于增加一张订单

    PublicFunctionAddSale(objSaleAsSale)

#p#

ASP.NET水晶报表教程之创建表现层页面

接下来,开始创建表现层页面。首先,要创建一个可以给销售员登陆的页面,如下图所示。

实例讲解:ASP.NET水晶报表教程之表现层页面一

在销售员成功登陆后,可以给销售员输入某样货品销售的数量,如下图:

此外,为了给业务主管看到某个时期的销售情况,创建如下页面。

实例讲解:ASP.NET水晶报表教程之表现层页面三

其中,业务主管可以选择查看某样货品在某个时期(选择开始日期,结束日期)的销售情况,以图表方式显示。

这里特别值得一提的是,日历控件的使用。在页面中放置日历控件后,设置如下代码:

  1. <inputtype="image"onclick="Page_ValidationActive=false;"src="datepicker.gif"alt="ShowCalender"runat="server"onserverclick="ShowCal1"id="ImgCal1"name="ImgCal1"> 

这里设置page_validationactive参数为false,所以不需要重新提交页面,并且,在onserverclick事件中,设置处理的代码,如下所示:

 

  1. publicvoidShowCal1(Objectsender,System.Web.UI.ImageClickEventArgse)  
  2. {//显示日历控件  
  3. DtPicker1.Visible=true;  

当用户选择了相关的日期后,在文本框中可以获得相关的日期:

  1. privatevoidDtPicker1_SelectionChanged(objectsender,System.EventArgse)  
  2. {  
  3. txtStartDate.Text=DtPicker1.SelectedDate.ToShortDateString();  
  4. DtPicker1.Visible=false;  

在提交的页面中,处理的代码如下:

  1. privatevoidbSubmit_ServerClick(objectsender,System.EventArgse)  
  2. {  
  3. Response.Redirect("ViewReport.aspx?ItemId="+cboItemType.SelectedItem.Value+"&StartDate="+txtStartDate.Text+"&EndDate="+txtEndDate.Text);} 

在提交页面后,将跳转到浏览报表的页面viewreport.aspx,传入相关的参数,如货品ID,开始和结束日期。

ASP.NET水晶报表教程之创建报表

首先,往窗体中添加水晶报表控件,之后,就可以用水晶报表的报表设计器设计一份报表了。新建一个水晶报表文件类型,命名为itemreport.rpt,接着使用报表设计专家,并选择设计标准型的报表,点下一步,出现如下画面:

实例讲解:ASP.NET水晶报表教程之选择数据库

我们选择使用ADO类型的数据,在弹出的窗口中,设置好sqlserver的登陆名,登陆密码,选择好数据库后,选择在报表中使用tblsales表,如下图:

实例讲解:ASP.NET水晶报表教程之选择报表

接着选Next,在要在报表中显示的字段中,选择SaleDate和Amount。之后,一直选NEXT,忽略其他相关设置,***,在图表类型中选择折线图,如下图:

***点击finish,可以看到如下的报表:

实例讲解:ASP.NET水晶报表教程之图标类型

再次选择报表专家,在弹出的窗口中选择数据页,在数据可用字段中选择salesdate,并且可以在文本页中,设置适当的报表标题。

实例讲解:ASP.NET水晶报表教程之创建报表

由于要根据输入的日期,货品参数来动态显示报表,因此我们要设置参数字段。在报表设计器中,在字段资源管理器中,选择参数字段,鼠标右击选择“新建”,新建如下三个参数字段。

名称: 类型:
ItemId Number
StartDate Date
EndDate Date

***,要设置相关的查询公式,在除报表页眉的区域,鼠标右键点击,在弹出菜单中选择“报表|编辑选择公式|记录”,输入如下的公式:

实例讲解:ASP.NET水晶报表教程之公式编辑器

在上面的公式编辑器中,分为左中右三部分,左边的是报表的字段,中间的是相关的功能函数,最右边的是运算符,双击其中选中的部分,则可以添加到下部的公式显示区域中。***,保存建立的公式。

#p#

ASP.NET水晶报表教程之在程序中使用报表

接下来,我们可以在程序中用代码处理和报表的连接过程。首先,在工程项目中,增加如下的两个命名空间的引用(注意,在代码中也必须用using引入它们):

  1. CrystalDecisions.CrystalReports.Engine  
  2. CrystalDecisions.Shared 

在viewreport.aspx的Page_load事件中,加入以下代码

  1. //接收传递的参数  
  2. nItemId=int.Parse(Request.QueryString.Get("ItemId"));  
  3. strStartDate=Request.QueryString.Get("StartDate");  
  4. strEndDate=Request.QueryString.Get("EndDate");  
  5. //声明报表的数据对象  
  6. CrystalDecisions.CrystalReports.Engine.DatabasecrDatabase;CrystalDecisions.CrystalReports.Engine.TablecrTable;  
  7. TableLogOnInfodbConn=newTableLogOnInfo();  
  8. //创建报表对象opt  
  9. ReportDocumentoRpt=newReportDocument();  
  10. //加载已经做好的报表  
  11. oRpt.Load("F:\\aspnet\\WroxWeb\\ItemReport.rpt");  
  12. //连接数据库,获得相关的登陆信息  
  13. crDatabase=oRpt.Database;  
  14. //定义一个arrtables对象数组  
  15. object[]arrTables=newobject[1];  
  16. crDatabase.Tables.CopyTo(arrTables,0);  
  17. crTable=(CrystalDecisions.CrystalReports.Engine.Table)arrTables[0];dbConn=crTable.LogOnInfo;  
  18. //设置相关的登陆数据库的信息  
  19. dbConn.ConnectionInfo.DatabaseName="WroxSellers";dbConn.ConnectionInfo.ServerName="localhost";  
  20. dbConn.ConnectionInfo.UserID="sa";  
  21. dbConn.ConnectionInfo.Password="test";  
  22. //将登陆的信息应用于crtable表对象  
  23. crTable.ApplyLogOnInfo(dbConn);  
  24. //将报表和报表浏览控件绑定  
  25. crViewer.ReportSource=oRpt;  
  26. //传递参数  
  27. setReportParameters(); 

在上面的代码中,首先接收了日期,货品编号等参数,并实例化了Database,Table和TableLogOnInfo三个类,它们是用来在运行时,建立报表和数据库的连接必需的。再使用

           oRpt.Load("F:\\aspnet\\WroxWeb\\ItemReport.rpt");

来装载已经做好了的报表。

在装载完报表后,将数据库中要使用的表复制到一个对象数组中去,并选择对象数组中的***个表元素,将其转换为水晶报表的报表对象。接着,再设置LOGONINFO中的登陆数据库的信息。***,将报表源与报表浏览控件绑定。

#p#

ASP.NET水晶报表教程之传递参数到ASP.NET水晶报表

定义一个新的过程,setReportParameters(),代码如下:

  1. privatevoidsetReportParameters()  
  2. {  
  3. //alltheparameterfieldswillbeaddedtothiscollection  
  4. ParameterFieldsparamFields=newParameterFields();  
  5. //theparameterfieldstobesenttothereport  
  6. ParameterFieldpfItemId=newParameterField();  
  7. ParameterFieldpfStartDate=newParameterField();  
  8. ParameterFieldpfEndDate=newParameterField();  
  9. //设置在报表中,将要接受的参数字段的名称  
  10. pfItemId.ParameterFieldName="ItemId";  
  11. pfStartDate.ParameterFieldName="StartDate";  
  12. pfEndDate.ParameterFieldName="EndDate";  
  13. ParameterDiscreteValuedcItemId=newParameterDiscreteValue();  
  14. ParameterDiscreteValuedcStartDate=newParameterDiscreteValue();ParameterDiscreteValuedcEndDate=newParameterDiscreteValue();  
  15.  
  16. dcItemId.Value=nItemId;  
  17. dcStartDate.Value=DateTime.Parse(strStartDate);  
  18. dcEndDate.Value=DateTime.Parse(strEndDate);  
  19.  
  20. pfItemId.CurrentValues.Add(dcItemId);  
  21. pfStartDate.CurrentValues.Add(dcStartDate);pfEndDate.CurrentValues.Add(dcEndDate);  
  22. paramFields.Add(pfItemId);  
  23. paramFields.Add(pfStartDate);  
  24. paramFields.Add(pfEndDate);  
  25.  
  26. //将参数集合绑定到报表浏览控件  
  27. crViewer.ParameterFieldInfo=paramFields;  

现在来解释一下上面的代码。在水晶报表中,浏览器控件有一个属性parameterfieldsinfo,该属性可以通过绑定parameterfields类型的集合,将相关的参数的实际数值传递到报表。Parameterfields类型集合通过add的方法,接收Parameterfield类型的对象。因此,我们先为itemid,startdate,enddate三个参数创建parameterfield类型的对象,并且设置它们对应报表中接受参数的名称:

  1. ParameterFieldsparamFields=newParameterFields();  
  2. ParameterFieldpfItemId=newParameterField();  
  3. ParameterFieldpfStartDate=newParameterField();  
  4. ParameterFieldpfEndDate=newParameterField();  
  5. //设置在报表中,将要接受的参数字段的名称  
  6. pfItemId.ParameterFieldName="ItemId";  
  7. pfStartDate.ParameterFieldName="StartDate";  
  8. pfEndDate.ParameterFieldName="EndDate"

接着,可以为这些参数字段设置具体的值了,但由于parameterfield必须接受ParameterDiscreteValue类型的对象,所以,再创建相关的实例:

  1. ParameterDiscreteValuedcItemId=newParameterDiscreteValue();  
  2. ParameterDiscreteValuedcStartDate=newParameterDiscreteValue();  
  3. ParameterDiscreteValuedcEndDate=newParameterDiscreteValue();  
  4. dcItemId.Value=nItemId;  
  5. dcStartDate.Value=DateTime.Parse(strStartDate);  
  6. dcEndDate.Value=DateTime.Parse(strEndDate); 

***,就可以在三个parameterfield的对象中的currentvalues中设置它们的值,并往paramFields集合中加进这三个parameterfield对象。

运行的结果如下。

以上ASP.NET水晶报表教程相关程序在VS.NET2003,crystalreport9以上版本可以正确运行。

【编辑推荐】

  1. 浅谈ASP.NET报表控件
  2. 概述ASP.NET水晶报表
  3. VS.Net中的水晶报表的应用
  4. VS.NET 2002下水晶报表的安装与部署
  5. ASP.NET 2.0部署WEB应用程序浅析
  6. ASP.NET中的数据源控件


 

责任编辑:老杨 来源: 搜狐IT
相关推荐

2009-07-29 09:29:06

ASP.NET水晶报表

2009-08-02 11:48:58

ASP.NET水晶报表ASP.NET

2009-08-25 17:00:32

ASP.NET水晶报表

2009-10-16 13:30:51

VB.NET水晶报表控

2010-01-14 10:52:13

VB.NET水晶报表

2009-08-31 16:09:42

.net水晶报表使用学

2009-07-27 16:19:59

ASP.NET报表控件

2009-07-30 13:42:28

ASP.NET报表问题ASP.NET

2009-07-22 17:45:35

2009-07-28 17:17:19

2009-11-05 14:03:28

Visual Stud

2009-12-11 14:57:56

ASP.NET

2009-08-05 10:36:08

开发ASP.NET

2009-07-20 16:08:04

ASP.NET应用程序

2009-08-05 16:53:14

ASP.NET组件设计

2009-07-29 16:15:03

asp.net在线学习

2009-08-07 17:49:44

控件设计器

2009-11-26 13:27:10

VS2003水晶报表

2011-04-13 14:19:52

Asp.Net.Net

2009-01-03 09:34:30

ASP.NET.NET性能优化

同话题下的热门内容

太强了!Python 开发桌面小工具,让代码替我们干重复的工作!Python轻量级Web框架:Bottle库!Python居然被用来开发游戏了?盘点你想不到的Python开发场景用了那么久的Lombok,你知道它的原理么?实战 | 如何用 Python 自动化监控文件夹完成服务部署!Fury:一个基于JIT动态编译的高性能多语言原生序列化框架细思恐极,插上U盘就开始执行Python代码为什么 Python、Ruby 等语言弃用了自增运算符?

编辑推荐

使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!五大自动化测试的Python框架图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)2018年最流行的十大编程语言,其中包括你用的语言吗?
我收藏的内容
点赞
收藏

51CTO技术栈公众号