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   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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值