Tony Gong的技术Blog  
技术旅途中蹒跚的行者

使用子报表

 

环境:

vs2005+ActiveReportsNet2


本节目标:

承接上节,上节用2group的方式打印了普通的分栏帐票。实现了换列换页的三维表示。

本节用子报表的方式来实现该功能。

 

子报表的功能比上面那个方法来说,更强大,更灵活。复杂帐票一般都得用到子报表。

 

开始之前,先简单介绍一下子报表的用法。

0,子报表的一般用法如下:

1),先Add一个主模版(rpt1.rpx),若干子模版(这里就建了一个,sub1.rpx)

2),在主模版上放一个SubReport控件(该控件是一个占位符,sub1.rpx的内容将在这里显示),可以放在PageHeaer/Footer,GroupHeader/footerDetail上,这个要视用途来定。这里放在GroupHeader1上。

3),在主模版的GroupHeader1_Format事件(假如你的SubReport放在Detail中,就要用Detail_Format事件了)中,加入代码,生成子报表,并且给子报表设置数据源(这里为简单起见没有设置数据源):

    Private Sub GroupHeader1_Format(ByVal sender As ObjectByVal e As System.EventArgs) Handles GroupHeader1.Format

        
Dim rpt As New sub1()

        
Me.subReport1.Report = rpt

    
End Sub

4),然后就可以设计你的子报表了,加控件,加代码,和操作主模版一样做法。需要说明的是,子模版中的PageHeaderPageFooter是不起作用的。

5),然后御览,你会看到每页都包含的sub1.rpx的内容。假如你把SubReport控件放在Detail中的话,Detail中的每一行显示,都会把sub1.rpx的内容一起显示出来。

 

ok,正式开始了

1,先准备如下数据(把数据顺序组织成如下形式)

Chinese

1

Tony

100

Chinese

2

Mary

56

Chinese

3

Tom

76

Chinese

4

John

67

Chinese

5

Li

54

Chinese

6

Zhang

3

Chinese

7

Wang

100

Chinese

8

Gong

23

Chinese

9

Tian

78

Chinese

10

Jack

87

Maths

6

Zhang

0

Maths

7

Wang

2

Maths

8

Gong

56

Maths

9

Tian

99

Maths

10

Jack

88

 

 

2,创建一个AR主模版,1个子模版:

主模版(rpt1.rpx)

GroupHeader1中:

GroupHeader1DataField=”Class”

                       NewPage=”before”

ClassNo: DataField=”Class”

SubReport控件:需要注意的是,该控件的Width必须设成和实际要打印的Sub1.rpxwidth一样大,否则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,在formload事件中编写如下代码,把数据源传给模版,并显示模版:

  

Private Sub Form1_Load(ByVal sender As ObjectByVal 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

 

4,在rpt1.rpxGroupHeader1_Format事件,编写代码,显示子模版sub1.rpx.

 

  Private Sub GroupHeader1_Format(ByVal sender As ObjectByVal 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

 

       注意了我这里传给子模版的数据源。

Dim dv As DataView = New DataView(CType(Me.DataSource, DataTable), "Class='" & Me.Fields("Class").Value.ToString & "'""", DataViewRowState.CurrentRows)

       当打印第一页时,我传给子模版的数据源是:

Chinese

1

Tony

100

Chinese

2

Mary

56

Chinese

3

Tom

76

Chinese

4

John

67

Chinese

5

Li

54

       当打印Class=B的第二页时,我传给子模版的数据源变成了:

Chinese

6

Zhang

3

Chinese

7

Wang

100

Chinese

8

Gong

23

Chinese

9

Tian

78

Chinese

10

Jack

87

Maths

6

Zhang

0

Maths

7

Wang

2

Maths

8

Gong

56

Maths

9

Tian

99

Maths

10

Jack

88

 

 

5ok,御览看看效果吧。搞定收工。

posted on 2007-02-17 08:48  Tony.Gong  阅读(5896)  评论(15编辑  收藏  举报