代码改变世界

Crystal Report Web Viewer 使用Object Collection做数据源

2011-03-09 11:42 by gnorts, ... 阅读, ... 评论, 收藏, 编辑

众所周知,Crystal Report作为一款相当成熟的报表软件能够将数据源等都集成在RPT文件内部,我们在使用的时候只需提供数据库的LogonInfo,RPT文件就会自动帮我们去数据库中取出相应的数据。然而这样相当于将部分业务逻辑集成在了RPT文件内部,如果我们不想这么做,完全可以使用Object Collection作为RPT文件的数据源。

如果我们使用Object Collection作为RPT文件的数据源,那么RPT文件本身不包含任何逻辑,只是纯粹的作为一个Layout来使用。我们以一个公司的损益表为例:
损益表预览
如果我们将报表的每一行作为一个Object,那么我们就要定义class:

1 public class BPLItem
2 {
3 public string Item { get; set; } //项目
4   public string LineNum { get; set; } //行次
5   public string PBalance { get; set; } //本期数
6   public string YBalance { get; set; } //本年累计数
7   public BPLItem()
8 {
9 }
10 }

然后,在新建rpt文件时我们需要定义一个xml,如下所示:

1 <?xml version="1.0" encoding="UTF-8"?>
2  <BPLRPT>
3 <BPLItem Item="一、主营业务收入" LineNum="1" PBalance="" YBalance=""/>
4 <BPLItem Item="减:主营业务成本" LineNum="2" PBalance="1,110,874.61" YBalance="1,110,874.61"/>
5 <BPLItem Item="营业税金及附加" LineNum="3" PBalance="" YBalance=""/>
6 </BPLRPT>

XML中的属性值只是做个例子,然后我们新建RPT文件新建ADO.NET(XML)的connection,如图所示
创建BPL.RPT


之后在Designer中布置好相应的Layout,如图所示:
BPL
这样,我们的RPT文件就创建好了,在使用Crystal Report Web Viewer时,我们只需:

string reportPath = Server.MapPath("RPT/BPL_RPT.rpt");
ArrayList BPLItems
= PrepareData(); //获取你的数据,并创建成类BPLItem的ArrayList
ReportDocument BPLReportDoc = new ReportDocument();
BPLReportDoc.Load(reportPath);
BPLReportDoc.SetDataSource(BPLItems);
CrystalReportViewer1.ReportSource
= BPLReportDoc;
这样一来,数据库的登录,以及数据的读取都在PrepareData()这个函数当中进行。

BPLItem