程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ActiveReports工作總結3——換列打印

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

編輯:.NET實例教程

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

環境:

vs2005+ActiveReportsNet2

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



有如下數據源


最終希望打印成:




1,先准備如下數據

 

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

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

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

 

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

 

 

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

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

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

 

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

 

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

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

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

 

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

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

 

 

7,圖上的一個小問題,放在GroupHeader中的2個title(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和前面Textbox的DataField差不多意思,邦定一個用於換列的字段。在印刷時,一旦DataFIEld的內容變動,就做下面NewColumn和NewPage的動作。

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

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


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

 

當然,不要忘記把Detail的ColumnCount設置成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 Object, ByVal 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 Object, ByVal e As System.EventArgs) Handles Me.Load

     &nbsp;  ''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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved