您的位置:首页 > 其它

ActiveReports工作总结3——换列打印

2007-11-21 00:38 447 查看
本随笔讨论一下如何在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

'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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: