使用子报表
环境:
vs2005+ActiveReportsNet2
本节目标:
承接上节,上节用2个group的方式打印了普通的分栏帐票。实现了换列换页的三维表示。
本节用子报表的方式来实现该功能。
子报表的功能比上面那个方法来说,更强大,更灵活。复杂帐票一般都得用到子报表。
开始之前,先简单介绍一下子报表的用法。
0,子报表的一般用法如下:
(1),先Add一个主模版(rpt1.rpx),若干子模版(这里就建了一个,sub1.rpx)
(2),在主模版上放一个SubReport控件(该控件是一个占位符,sub1.rpx的内容将在这里显示),可以放在PageHeaer/Footer,GroupHeader/footer和Detail上,这个要视用途来定。这里放在GroupHeader1上。
(3),在主模版的GroupHeader1_Format事件(假如你的SubReport放在Detail中,就要用Detail_Format事件了)中,加入代码,生成子报表,并且给子报表设置数据源(这里为简单起见没有设置数据源):
Dim rpt As New sub1()
Me.subReport1.Report = rpt
End Sub
(4),然后就可以设计你的子报表了,加控件,加代码,和操作主模版一样做法。需要说明的是,子模版中的PageHeader和PageFooter是不起作用的。
(5),然后御览,你会看到每页都包含的sub1.rpx的内容。假如你把SubReport控件放在Detail中的话,Detail中的每一行显示,都会把sub1.rpx的内容一起显示出来。
ok,正式开始了
1,先准备如下数据(把数据顺序组织成如下形式):
A |
Chinese |
1 |
Tony |
100 |
A |
Chinese |
2 |
Mary |
56 |
A |
Chinese |
3 |
Tom |
76 |
A |
Chinese |
4 |
John |
67 |
A |
Chinese |
5 |
Li |
54 |
B |
Chinese |
6 |
Zhang |
3 |
B |
Chinese |
7 |
Wang |
100 |
B |
Chinese |
8 |
Gong |
23 |
B |
Chinese |
9 |
Tian |
78 |
B |
Chinese |
10 |
Jack |
87 |
B |
Maths |
6 |
Zhang |
0 |
B |
Maths |
7 |
Wang |
2 |
B |
Maths |
8 |
Gong |
56 |
B |
Maths |
9 |
Tian |
99 |
B |
Maths |
10 |
Jack |
88 |
2,创建一个AR主模版,1个子模版:
主模版(rpt1.rpx):
GroupHeader1中:
GroupHeader1:DataField=”Class”
NewPage=”before”
ClassNo: DataField=”Class”
SubReport控件:需要注意的是,该控件的Width必须设成和实际要打印的Sub1.rpx的width一样大,否则sub1.rpx的内容将不能完全显示出来。后面我会专门讲解一下如何在代码中控制各控件width.
子模版1(sub1.rpx)
GroupHeader1: DataField=”Subject”
NewColumn=”Before”
Subject: DataField=”subject”
Detail: ColumnCount=2
TextBox: Datafield=”ID”
TextBox2:Datafield=”Name”
TextBox3:DataField=”Score”
3,在form的load事件中编写如下代码,把数据源传给模版,并显示模版:
Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb;Persist Security Info=False"
Dim cmd As String = "Select * from table1 order by ID"
Dim adapter As New OleDbDataAdapter(cmd, conn)
Dim ds As New DataSet
adapter.Fill(ds)
Dim rpt As New rpt1
rpt.DataSource = ds.Tables(0)
rpt.Run()
Me.Viewer1.Document = rpt.Document
End Sub
4,在rpt1.rpx的GroupHeader1_Format事件,编写代码,显示子模版sub1.rpx.。
Dim sub1 As New sub1()
Me.subReport1.Report = sub1
'為子報表設置数据源
Dim dv As DataView = New DataView(CType(Me.DataSource, DataTable), "Class='" & Me.Fields("Class").Value.ToString & "'", "", DataViewRowState.CurrentRows)
Me.subReport1.Report.DataSource = dv
End Sub
注意了我这里传给子模版的数据源。
当打印第一页时,我传给子模版的数据源是:
A |
Chinese |
1 |
Tony |
100 |
A |
Chinese |
2 |
Mary |
56 |
A |
Chinese |
3 |
Tom |
76 |
A |
Chinese |
4 |
John |
67 |
A |
Chinese |
5 |
Li |
54 |
当打印Class=B的第二页时,我传给子模版的数据源变成了:
B |
Chinese |
6 |
Zhang |
3 |
B |
Chinese |
7 |
Wang |
100 |
B |
Chinese |
8 |
Gong |
23 |
B |
Chinese |
9 |
Tian |
78 |
B |
Chinese |
10 |
Jack |
87 |
B |
Maths |
6 |
Zhang |
0 |
B |
Maths |
7 |
Wang |
2 |
B |
Maths |
8 |
Gong |
56 |
B |
Maths |
9 |
Tian |
99 |
B |
Maths |
10 |
Jack |
88 |
5,ok,御览看看效果吧。搞定收工。