MultiRow发现之旅(七)- 套打和打印

前文回顾

MultiRow发现之旅(一)- 高效模板设计器

MultiRow发现之旅(二)- 详解属性管理器

MultiRow发现之旅(三)- 模板管理器和Table

MultiRow发现之旅(四)- 使用MultiRow开发WinForm应用(附源码)

MultiRow发现之旅(五)- MultiRow版俄罗斯方块(exe + 源码)

MultiRow发现之旅(六)- 使用MultiRow开发票据应用(附源码)

前面的一些文章介绍了如何使用MultiRow设计模板,以及完成一个简单的数据库应用,本文将介绍,在应用设计完成后,你如何使用MulitRow提供的打印功能,按照你的期望,打印到纸张或者其他图形化界面上。首先我们简单来介绍一下MultiRow提供的打印接口,然后着重介绍一些对打印效果的设置。

打印接口:在GcMulitRow控件上有面有若个Print方法的重载,还有两个PrintPreview的重载。其中,Print方法支持将GcMulitRow打印到一个Graphics(Print方法的第一个参数为Graphics对象)上面,或者直接输出到打印机,你可以根据不同的需求调用不同的方法重载。

这里需要提一下的是,GcMultiRow的打印是基于每个Section的,也就是说,打印的时候,你可以定制,如何打印ColumnHeader,ColumnFooter,以及所有的Row。你会发现Print方法的参数当中,有一些让你指定打印的范围和样式,不过这些打印方法大部分是在需要打印到Graphics对象时需要指定的,而对于直接输出到打印机,GcMultiRow提供了一个属性叫做PrintSettings,通过设置这个属性下面的一些子属性,你可以定制在输出到打印机时的打印设置。

打印设置:在GcMulitRow控件上面有一个属性是PrintSettings,他有一些属性用来控制打印时候的效果。下面我们来对一些重要的属性做个介绍。

1. PagingMode

这个属性指出了在打印的过程中如何分页。我们上面说过,MultiRow的打印是基于Section的,这个属性也就是指定,如何将MulitRow当中的Section分布在每个页面上面。

SingleRow模式

这个设置说明在将MulitRow当中的每一个Row打印到一页纸上面。我们使用之前的一篇文章的示例作为演示,下面的一页纸当中,只打印了一个Row:

Flow模式

这个设置说明MulitRow将从第一页纸开始安排所有的Row,一个挨着一个从上到下排列,直到当前页面不能显示下一个Row,将重新生成一页,继续排列。下图所示,按Flow模式打印,这个页面只能显示两个Row:

MultiColumns模式

这种模式一般适用于当MulitRow的Row的宽度比较窄,一页纸可以打印好几列Row,为了节省纸张,可以选择这种模式,打印多个列到一页纸上面。请看下图的效果,做了一个宽度较小的模板:

另外,上面的MultiColumns模式下,你还可以选择所有Row的安排方式是依次从上到下,还是从左到右排列的。这个属性是MultiColumnsPrintOrder,默认为DownThenOver,也就是从上到下排列,一列打印满之后再从下一列继续打印。如果改成OverThenDown,上图的效果就成这样子了:

2. 打印Row的范围(PrintRange,FromRow,ToRow)

通过设置PrintRange你可以选择打印的时候,只打印你想要的Row,比如PrintRange为AllRows,所有的Row将会被打印到页面;为SelectedRows时,只打印你当前在GcMulitRow控件上面选中的Row;为CurrentRow,只打印CurrentCell所在的Row;为SomeRows的时候,你可以设置另外两个属性,FromRow和ToRow,指出Row的索引,指定从那行开始打印,结束于哪行。比如基于上面的例子,FromRow为10,ToRow为20,那么页面上只打印10到20之间这十个Row:

上面的三个属性的设置,对不同的PagingMode都是起作用的。

3. AutoFitWidth和ZoomFactor

当你的模板比较宽,超出了一页纸可以容纳的宽度,这样就需要两页纸来打印完整的Row,如果这时候你希望一页纸也可以容纳这么宽的模板,你可以设置AutoFitWidth,来将打印时候的模板宽度进行缩小,让纸张可以容纳,这时候为了保证打印出来的效果,高度也会被自动缩小。使用之前的一个模板,看下面没有设置AutoFitWidth之前的一个效果,模板太宽,Row被拦腰折断,需要两页显示一个Row:

将AutoFitWidth设置为True,宽度方向将被缩小来适应纸张的宽度,请看下图,每页纸都可以容纳一个Row,这样节省了纸张:

另外一个属性ZoomFactor,跟AutoFitWidth有相似的功能,但更灵活,你可以指定ZoomFactor的值从0.1到4之间,任意缩放打印时的Row的大小,根据你的需求排放Row。比如下面的示例展示在Flow的分页模式下,当ZoomFactor为0.5时,一个页面将会布置更多的Row:

4. SectionMargin和ColumnMargin

上面提过,MultiRow的打印是基于每个Section的,因此通过这两个属性可以设置相邻Section之间的空隙。用上面的示例,设置SectionMargin为15,每个Row之间将会有空隙,效果如下:

对于ColumnMargin,要求为MultiColumns分页模式下,相邻两列之间的空隙,请看之前展示MultiColumns分页模式下的示例在设置ColumnMargin为25之后的效果:

5. PrintHeader和PrintFooter

如果你已经熟悉了MultiRow的结构,你肯定知道MultiRow有三种Section,ColumnHeader,Row以及ColumnFooter,前面演示的示例只使用了Row,没有ColumnHeader和ColumnFooter,下面创建的一个模板,是一个移动通信的发票,有ColumnHeader和ColumnFooter,这个示例将会在后续的博文中详细讲述如何使用MulitRow来制作。运行起来的效果如下所示:

创建这样的模板分为三个部分,ColumnHeader作为发票头显示公司名称以及其他发票信息,Row部分是主要内容显示一些明细,ColumnFooter是一些额外信息显示营业厅收款员信息,请看下图的三个黑框部分,从上到下分别代表ColumnHeader,Row,ColumnFooter:

在打印的时候,你可以通过设置PrintHeader和PrintFooter属性指定上面的ColumnHeader和ColumnFooter如何被打印在页面上面。下面展示在SingleRow模式下,将PrintHeader和PrintFooter都设置为AllRows,这样每页纸上面都有公司名称,营业厅,收款员信息了,如下图所示

有时候,你希望只在第一页显示公司名称,后面的页面只显示内容信息,你可以将PrintHeader属性设置为FirstPage,这样只有第一页显示公司名称信息了。其他的值你可以自己尝试设置,在这里就不一一介绍了。

6. PrintStyle

这是一个非常实用的属性,他控制打印的样式,默认为Rich,代表所有的控件上面的样式和内容都要打印。另外还有Compact和Content模式。在这里值得一提的是Content的打印模式,如果将PrintStyle设置为Content模式,此时,所有的样式将不被打印,只有每个格子当中的值被打印出来,这样你可以实现“套打”的功能。也就是说,纸张的样式,以及格子之类的固定格式已经存在纸张上面,只需要打印变化的内容就行了,这样可以加快打印速度,节约打印耗材,目前很多票据都是采用这种打印模式。

直接使用上面的示例来说明,如果将PrintStyle设置为Content,打印效果如下:

可以看出,只有蓝色的内容被打印了,这种模式下,你往打印机里面放入一张有固定格式的票据,比如下面的样子:

然后启动打印功能,一张成型的发票就被打印出来了。

7. 页面和打印机配置

调用GcMultiRow的PageSetup()方法,你可以打开页面配置窗口,更改页面的一些设置,MulitRow就会根据你的设置评估打印时需要如何布局:

还可以在调用Print()方法时,指出要不要弹出打印机设置对话框,更改打印机的设置:

总结:MultiRow提供了丰富的打印功能,除了上面罗列的一些之外,你还可以进行自定义打印,在这里就不过多的阐述,请参考相关文档,或者在论坛,我们一起探讨。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python攻城狮

使用Selenium抓取QQ空间好友说说1.安装Selenium2.在Python中使用Selenium获取QQ空间好友说说3.代码实现(基于Python3)

通过Robo 3T(数据库MongoDB的一款功能强大的数据库管理工具)可以看到我们已经将拿到的数据库存储于数据库中

11520
来自专栏数据库

基于关系型数据库的App Inventor网络应用(3)

第三节 初识Node-RED 开发环境简介 如图8所示,整个浏览器窗口被划分为四个部分: (1) 顶部黑色通栏,左侧显示Node-RED的LOGO,右侧显著位置...

35470
来自专栏DeveWork

【译】WordPress 中的50个过滤器(2):先介绍10个过滤器

在上一篇文章中,我们介绍了WordPress 世界的过滤器;本篇文章的话我们将要探索50个笔者精选的过滤器,并一一通过例子解释其如何工作的。 事不宜迟,让...

22360
来自专栏移动开发之家

Flutter完整开发实战详解(二、 快速开发实战篇)

 作为系列文章的第二篇,继《Flutter完整开发实战详解(一、Dart语言和Flutter基础)》之后,本篇将为你着重展示:如何搭建一个通用的Flutter ...

1.7K10
来自专栏React

React和Redux——状态管理Flux和Redux

在强调组件化的React中,我们需要以高内聚、低耦合的原则设计高可复用性的组件。因此渲染组件的数据由两部分组成,一个是由父组件传入的Props参数、一个是组件的...

28870
来自专栏搞前端的李蚊子

ReactJs移动端兼容问题汇总

A:初步怀疑是css属性没有加前缀引发的兼容问题,但添加后发现也不行,通过webview调试后控制台输出Set is undefined,搜索后发现React依...

26750
来自专栏angularejs学习篇

angularjs学习第四天笔记(第一篇:简单的表单验证)

您好,我是一名后端开发工程师,由于工作需要,现在系统的从0开始学习前端js框架之angular,每天把学习的一些心得分享出来,如果有什么说的不对的地方,请多多指...

11510
来自专栏我的博客

Dedecms普通模型入门教程

1. 默认模板设置 里面是default后面变量名字是cfg_df_style(在模版中使用方法是{dede:golbal.cfg_df_style/}获取的路...

37460
来自专栏angularejs学习篇

angularjs学习第四天笔记(第一篇:简单的表单验证)

您好,我是一名后端开发工程师,由于工作需要,现在系统的从0开始学习前端js框架之angular,每天把学习的一些心得分享出来,如果有什么说的不对的地方,请多多指...

11920
来自专栏圣杰的专栏

ABP入门系列(14)——应用BootstrapTable表格插件

源码路径:Github-LearningMpaAbp 1. 引言 之前的文章ABP入门系列(7)——分页实现讲解了如何进行分页展示,但其分页展示仅适用于前台we...

81050

扫码关注云+社区

领取腾讯云代金券