ActiveReports工作總結3——換列打印

本隨筆討論一下如何在AR中控制換列打印

環境:

vs2005+ActiveReportsNet2

AR下載地址:ftp://ftp.datadynamics.com/

有如下數據源


最終希望打印成:




1,先準備如下數據

 

2,創建一個AR模版,大致佈局與控件如下圖:

Detail section 中放2Textbox,分別邦定字段”ID””Name”(修改他們的DataField屬性)

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

 

3,在formload事件中編寫如下代碼,把數據源傳給模版,並顯示模版:

 

 

4,運行程序,帳票將被打印出來。

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

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

 

如圖,這時候假如數據過多,多出的數據將會自動到下頁顯示

 

5,假如想要數據在一頁中換列顯示,可以這樣做:

       修改DetailColumnCount屬性(也可以在代碼中動態實現),此處可以修改成你希望每頁打印的列數,比如每頁2列。

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

 

6,如此一頁數據打印不下,將換列顯示

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

 

 

7,圖上的一個小問題,放在GroupHeader中的2title(StudentID,StudentName)沒有自動換列,可以修改Groupheader的如下屬性:

這裏我們選OnColumn或者All都可以(All的話換頁換列時都會印刷Groupheader/groupfooter裏的內容。

 

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

 

8,最終結果如下:

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

 

 

9,實際開發中,此處還會有一個問題,假如你設置的coulumnCount過大,過多的換列導致一張紙打印不下。比如把coulumnCount設置成5,再把detail拉高一點,御覽出來,會出現一條紅線。

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

 

這樣的話,實際打印會根據紅線打印2張。假如需要控制的話,可以在代碼中根據帳票的PrintWidth textbox控件的width確定Detail.CoulumnCount

 

 

10,上面那種換列是被動換列(一頁打不下了再換列),假如我們想主動換列(比如一頁想打印3列,每列只打印3個生徒),該怎麼處理呢?

首先,我們先來看看和換列有關的幾個屬性:

點中GroupHeader,看屬性欄,主要是如下2個屬性:

1):DataField:這裏的DataField和前面TextboxDataField差不多意思,邦定一個用於換列的字段。在印刷時,一旦DataField的內容變動,就做下面NewColumnNewPage的動作。

2〕:NewColumn:設置是在打印前或者後換列。

由於我們現在數據源也就IDName,我們先把ID放進去試試:

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

 

當然,不要忘記把DetailColumnCount設置成3

 

11,御覽的效果

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

 

DataField中的換列字段我們設置成了ID,一旦ID的值發生變動,就強制換列,由於ID的值全部不等,所以,打印了一行數據,就強制換列了。

 

那我們想每列打印3行數據,應該怎麼做呢?應該很多人都想到了吧。

 

12,我們可以在當前的數據源table上,加入1個字段,讓這個字段每3次變動一下,然後DataField邦定該字段就可以了。

數據源修改成如下:

ColumnID

ID

Name

0

1

Tony

0

2

Gong

0

3

Tom

1

4

John

1

5

Li

 

具體代碼如下:

    Private Sub Form1_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load

        
'Show the table1

        
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"

        
Dim adapter As New OleDbDataAdapter(cmd, conn)

        
Dim ds As New DataSet

        adapter.Fill(ds)

 

 

        
'Add column "ColumnID" to table(0)

        
With ds.Tables(0)

            .Columns.Add(
"ColumnID"GetType(Int32))

            
For indexForRows As Int32 = 0 To .Rows.Count - 1

                .Rows(indexForRows)(
"ColumnID"= Math.Truncate(indexForRows / 3)

            
Next

        
End With

 

 

 

        
Dim rpt As New rpt1

        rpt.DataSource 
= ds.Tables(0)

        rpt.Run()

        
Me.Viewer1.Document = rpt.Document

 

End Sub

 

13,把DataField改成ColumnID之後,再御覽,這正是我們需要的結果:

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




恩,好了,貼圖貼的好辛苦啊。
下一篇說換頁。
 

 

    Private Sub Form1_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load

        
'Show the table1

        
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"

        
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 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章