【IT168 技术文档】
上篇随笔演示了在ActiveReport for .net中如何绑定数据源,例如DataSet,DataView。本文将通过一些示例代码继续演示如何绑定对象集合以及如何从对象集合或列表中提取数据。
1. 直接绑定:
我们可以自己定义一个Collection,从IList继承,并使其中的每个对象都是一个实体,例如:
Customer和CustomerCollection。然后给ActiveReport报表的DataSource直接赋值为CustomerCollection的实例就可以了。这种绑定方法在ActiveReport for .net自带的例子里有完整的演示。
2. 手工加载显示对象的数据:
在这里要用到两个事件:DataInitialize和FetchData。
DataInitialize用来定义字段列表,获取数据等工作,FetchData用来指定每个字段的值。
我们简单定义一个Customer类
public class Customer { public int ID; public string Name; public string Address; }
再给报表定义一个Customer数组,用来保存要显示的数据,比如:
public Customer[] customers;
还需要一个值来保存当前记录的索引:private int index =0;
接下来在DataInitialize中定义报表有那些字段:
this.Fields.Add("Name"); this.Fields.Add("Address");
然后在FetchData事件中添加以下代码:
if (this.index >= this.customers.Length ) { eArgs.EOF = true; return; } else { eArgs.EOF = false; } this.Fields["Name"].Value = customers[this.index].Name; this.Fields["Address"].Value = customers[this.index].Address; this.index += 1;
这段代码的含义就是将Customer数组中的每个Customer实例的Name和Address属性值赋给报表的Name和Address字段。
代码中的第一个if分支是判断是否已经加载到了最后一条数据,如果是,设置eArgs.EOF为ture,并返回,否则继续加载下一条数据。
然后我们可以将要显示的数据放在Customers数组中,并启动显示报表:
Customer[] customers = new Customer[2]; Customer c = new Customer(); c.Name = "James"; c.Address = "Noljadfallsjf"; Customer c2 = new Customer(); c2.Name = "Joe"; c2.Address = "adfaafadf"; customers[0] = c; customers[1] = c2; rpt.customers = customers; rpt.Run(); this.viewer1.Document = rpt.Document;
通过上面的示例可以看到,第二种方式虽然比较烦琐,需要程序员自己处理很多东西,但是这样程序员拥有完全的操控能力,特别是需要对取出的数据作很多复杂的处理时,这样的操控能力是非常重要的。
上篇随笔演示了在ActiveReport for .net中如何从对象集合中提取数据。本文简单介绍如何使用子报表来显示主从表中的数据。
1. 在需要显示主从表中的数据时,使用子报表能够提供很大的灵活性,一般就是把主表的信息显示在detail中,如果要每页的上方都要显示主表,就可以放在PageHeader中。再把子表的信息放在Detail中,然后把子报表中的控件直接绑定到数据源上或者使用上篇随笔中的提到的方式从对象集合中提取数据。
2. 使用子报表:
新建报表,然后在工具箱上可以看到SubReport控件,拖放一个控件到Detail部分,用此控件来加载子报表。
再新建一个报表,命名为SubReport1 ,接下来在主报表中写代码,在页面设计器上选中Detail部分,在属性窗口切换到事件栏,双击Format,将会产生Detail_Format事件,下面就要在这个事件里指定子报表控件所要加载的报表。
3. 由于Detail部分会进行重复显示的,所以,只能指定一次报表源,在这里,我们按照下面的例子:
ActiveReport sub = null; private void Detail_Format(object sender, System.EventArgs eArgs) { if ( sub == null ) { sub = new ActiveReports2(); this.SubReport.Report = sub; } }
先定义一个全局的子报表,然后在Detail_Format事件中对其进行初始化。
4. 还有要注意的一点是,在使用完子报表后要将其释放,销毁掉,具体的代码放在主报表的ReportEnd事件中,例如:
private void ActiveReports1_ReportEnd(object sender, System.EventArgs eArgs) { sub.Document.Dispose(); sub.Dispose(); sub = null; }
5. 下面剩下的工作就是摆放控件并设置显示的字段了,加载数据等等了,前面的随笔都有介绍。