本隨筆討論一下如何在AR中控制換列打印
環境:
vs2005+ActiveReportsNet2
1,先准備如下數據
2,創建一個AR模版,大致布局與控件如下圖:
Detail section 中放2個Textbox,分別邦定字段”ID”和”Name”(修改他們的DataFIEld屬性)
3,在form的load事件中編寫如下代碼,把數據源傳給模版,並顯示模版:
4,運行程序,帳票將被打印出來。
如圖,這時候假如數據過多,多出的數據將會自動到下頁顯示
5,假如想要數據在一頁中換列顯示,可以這樣做:
修改Detail的ColumnCount屬性(也可以在代碼中動態實現),此處可以修改成你希望每頁打印的列數,比如每頁2列。
6,如此一頁數據打印不下,將換列顯示
7,圖上的一個小問題,放在GroupHeader中的2個title(StudentID,StudentName)沒有自動換列,可以修改Groupheader的如下屬性:
這裡我們選OnColumn或者All都可以(All的話換頁換列時都會印刷Groupheader/groupfooter裡的內容。
8,最終結果如下:
9,實際開發中,此處還會有一個問題,假如你設置的coulumnCount過大,過多的換列導致一張紙打印不下。比如把coulumnCount設置成5,再把detail拉高一點,御覽出來,會出現一條紅線。
這樣的話,實際打印會根據紅線打印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,御覽的效果
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之後,再御覽,這正是我們需要的結果:
恩,好了,貼圖貼的好辛苦啊。
下一篇說換頁。
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)
Dim rpt As New rpt1
rpt.DataSource = ds.Tables(0)
rpt.Run()
Me.VIEwer1.Document = rpt.Document
End Sub