ActiveReports工作总结6——使用子报表

本节目标:

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

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

 

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

 

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

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

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

<!--[if !vml]--><!--[endif]-->

2),在主模版上放一个SubReport控件(该控件是一个占位符,sub1.rpx的内容将在这里显示),可以放在PageHeaer/Footer,GroupHeader/footerDetail上,这个要视用途来定。这里放在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),然后就可以设计你的子报表了,加控件,加代码,和操作主模版一样做法。需要说明的是,子模版中的PageHeaderPageFooter是不起作用的。

<!--[if !vml]-->ActiveReports工作总结6——使用子报表_第1张图片<!--[endif]-->

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

<!--[if !vml]--><!--[endif]-->

 

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.

<!--[if !vml]-->ActiveReports工作总结6——使用子报表_第2张图片<!--[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]-->ActiveReports工作总结6——使用子报表_第3张图片<!--[endif]-->

 

 

3,在formload事件中编写如下代码,把数据源传给模版,并显示模版:

  

 

 

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

 

 

 

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

 

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

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,御览看看效果吧。搞定收工。

<!--[if !vml]-->ActiveReports工作总结6——使用子报表_第4张图片<!--[endif]-->

<!--[if !vml]-->ActiveReports工作总结6——使用子报表_第5张图片<!--[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

 

你可能感兴趣的:(工作,object,Class,报表,textbox,dataset)