ActiveReports工作总结6——使用子报表
2007-11-21 00:43
495 查看
本节目标:
承接上节,上节用2个group的方式打印了普通的分栏帐票。实现了换列换页的三维表示。
本节用子报表的方式来实现该功能。
子报表的功能比上面那个方法来说,更强大,更灵活。复杂帐票一般都得用到子报表。
开始之前,先简单介绍一下子报表的用法。
0,子报表的一般用法如下:
(1),先Add一个主模版(rpt1.rpx),若干子模版(这里就建了一个,sub1.rpx)
<!--[if !vml]-->
<!--[endif]-->
(2),在主模版上放一个SubReport控件(该控件是一个占位符,sub1.rpx的内容将在这里显示),可以放在PageHeaer/Footer,GroupHeader/footer和Detail上,这个要视用途来定。这里放在GroupHeader1上。
<!--[if !vml]-->
<!--[endif]-->
(3),在主模版的GroupHeader1_Format事件(假如你的SubReport放在Detail中,就要用Detail_Format事件了)中,加入代码,生成子报表,并且给子报表设置数据源(这里为简单起见没有设置数据源):
Private Sub GroupHeader1_Format(ByVal sender As Object, ByVal e As System.EventArgs) Handles GroupHeader1.Format
Dim rpt As New sub1()
Me.subReport1.Report = rpt
End Sub
(4),然后就可以设计你的子报表了,加控件,加代码,和操作主模版一样做法。需要说明的是,子模版中的PageHeader和PageFooter是不起作用的。
<!--[if !vml]-->
<!--[endif]-->
(5),然后御览,你会看到每页都包含的sub1.rpx的内容。假如你把SubReport控件放在Detail中的话,Detail中的每一行显示,都会把sub1.rpx的内容一起显示出来。
<!--[if !vml]-->
<!--[endif]-->
ok,正式开始了
1,先准备如下数据(把数据顺序组织成如下形式):
2,创建一个AR主模版,1个子模版:
主模版(rpt1.rpx):
GroupHeader1中:
GroupHeader1:DataField=”Class”
NewPage=”before”
ClassNo: DataField=”Class”
SubReport控件:需要注意的是,该控件的Width必须设成和实际要打印的Sub1.rpx的width一样大,否则sub1.rpx的内容将不能完全显示出来。后面我会专门讲解一下如何在代码中控制各控件width.
<!--[if !vml]-->
<!--[endif]-->
子模版1(sub1.rpx)
GroupHeader1: DataField=”Subject”
NewColumn=”Before”
Subject: DataField=”subject”
Detail: ColumnCount=2
TextBox: Datafield=”ID”
TextBox2:Datafield=”Name”
TextBox3:DataField=”Score”
<!--[if !vml]-->
<!--[endif]-->
3,在form的load事件中编写如下代码,把数据源传给模版,并显示模版:
4,在rpt1.rpx的GroupHeader1_Format事件,编写代码,显示子模版sub1.rpx.。
注意了我这里传给子模版的数据源。
当打印第一页时,我传给子模版的数据源是:
当打印Class=B的第二页时,我传给子模版的数据源变成了:
5,ok,御览看看效果吧。搞定收工。
<!--[if !vml]-->
<!--[endif]-->
<!--[if !vml]-->
<!--[endif]-->
Dim dv As DataView = New DataView(CType(Me.DataSource, DataTable), "Class='" & Me.Fields("Class").Value.ToString & "'", "", DataViewRowState.CurrentRows)
Private Sub GroupHeader1_Format(ByVal sender As Object, ByVal e As System.EventArgs) Handles GroupHeader1.Format
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
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.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
承接上节,上节用2个group的方式打印了普通的分栏帐票。实现了换列换页的三维表示。
本节用子报表的方式来实现该功能。
子报表的功能比上面那个方法来说,更强大,更灵活。复杂帐票一般都得用到子报表。
开始之前,先简单介绍一下子报表的用法。
0,子报表的一般用法如下:
(1),先Add一个主模版(rpt1.rpx),若干子模版(这里就建了一个,sub1.rpx)
<!--[if !vml]-->
<!--[endif]-->
(2),在主模版上放一个SubReport控件(该控件是一个占位符,sub1.rpx的内容将在这里显示),可以放在PageHeaer/Footer,GroupHeader/footer和Detail上,这个要视用途来定。这里放在GroupHeader1上。
<!--[if !vml]-->
<!--[endif]-->
(3),在主模版的GroupHeader1_Format事件(假如你的SubReport放在Detail中,就要用Detail_Format事件了)中,加入代码,生成子报表,并且给子报表设置数据源(这里为简单起见没有设置数据源):
Private Sub GroupHeader1_Format(ByVal sender As Object, ByVal e As System.EventArgs) Handles GroupHeader1.Format
Dim rpt As New sub1()
Me.subReport1.Report = rpt
End Sub
(4),然后就可以设计你的子报表了,加控件,加代码,和操作主模版一样做法。需要说明的是,子模版中的PageHeader和PageFooter是不起作用的。
<!--[if !vml]-->
<!--[endif]-->
(5),然后御览,你会看到每页都包含的sub1.rpx的内容。假如你把SubReport控件放在Detail中的话,Detail中的每一行显示,都会把sub1.rpx的内容一起显示出来。
<!--[if !vml]-->
<!--[endif]-->
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 |
主模版(rpt1.rpx):
GroupHeader1中:
GroupHeader1:DataField=”Class”
NewPage=”before”
ClassNo: DataField=”Class”
SubReport控件:需要注意的是,该控件的Width必须设成和实际要打印的Sub1.rpx的width一样大,否则sub1.rpx的内容将不能完全显示出来。后面我会专门讲解一下如何在代码中控制各控件width.
<!--[if !vml]-->
<!--[endif]-->
子模版1(sub1.rpx)
GroupHeader1: DataField=”Subject”
NewColumn=”Before”
Subject: DataField=”subject”
Detail: ColumnCount=2
TextBox: Datafield=”ID”
TextBox2:Datafield=”Name”
TextBox3:DataField=”Score”
<!--[if !vml]-->
<!--[endif]-->
3,在form的load事件中编写如下代码,把数据源传给模版,并显示模版:
4,在rpt1.rpx的GroupHeader1_Format事件,编写代码,显示子模版sub1.rpx.。
注意了我这里传给子模版的数据源。
当打印第一页时,我传给子模版的数据源是:
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 |
<!--[if !vml]-->
<!--[endif]-->
<!--[if !vml]-->
<!--[endif]-->
Dim dv As DataView = New DataView(CType(Me.DataSource, DataTable), "Class='" & Me.Fields("Class").Value.ToString & "'", "", DataViewRowState.CurrentRows)
Private Sub GroupHeader1_Format(ByVal sender As Object, ByVal e As System.EventArgs) Handles GroupHeader1.Format
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
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.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
相关文章推荐
- ActiveReports工作总结6——使用子报表
- ActiveReports工作总结6——使用子报表
- 学习maven & SVN的使用——入职第2天工作总结
- ActiveReports工作总结9——打印参数设置
- web service CXF工作中使用总结
- 再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结
- ActiveReports工作总结2——数据源绑定
- ActiveReports工作总结3——换列打印
- 工作总结之预处理指令与宏的使用
- 在团800运维工作总结之salt的使用
- ActiveReports工作总结2——数据源绑定
- ActiveReports工作总结10——完整的一张成绩一览帐票
- 再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结
- 总结经常使用可以提高工作效率的工具集
- Android 使用 7z 压缩字符串(工作总结)
- ActiveReports工作总结5——常用分栏帐票印刷
- 工作总结-Xcode7中使用静态库环境配置手册
- 工作中Linux的使用总结
- 内存泄漏和使用工作线程常见方式总结
- API相关工作过往的总结之Sandcastle简要使用介绍