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 ObjectByVal e As System.EventArgs) Handles GroupHeader1.Format

        
Dim rpt As New sub1()

        
Me.subReport1.Report = rpt

    
End Sub

4),然後就可以設計你的子報表了,加控件,加代碼,和操作主模版一樣做法。需要說明的是,子模版中的PageHeaderPageFooter是不起作用的。

<!--[if !vml]--><!--[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]--><!--[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,在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]--><!--[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 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

 

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


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章