管理软件少不了打印,打印格式的设计是一个很烦人的事情,造轮子是我的爱好,而且水晶报表对于我的系统来说可能不适用。因为我的服务器暂时还不想开放1433。
 
几个相关名词:打印机、打印方案、横向打印、批量打印……
 图1(一个单据N个打印方案)
一个单据多个打印方案并不是不常见的事情,尽量的让实施人员简单快速的设计打印格式是一件很有意义的事情。
图2格式设计时
图3打印预览
 
打印设计器与系统紧密结合,只要在任意一个站点修改保存后其它站点也就能同时得到最新的设计成果。
 
我已经等不急要开始说机制了(我的机制并不完美,在这里只是抛砖引玉):
1.  简单的设计器就不说了跟界面设计器是同一个机制。
2.  PrintDocument是打印就用这类,详细用法就不说了
3.  从水晶报表过来的Section,在还没成形的时候也曾经想做到类似像水晶报表的分Section,分区在界面的几个区域内,后来还是修改成这样了。
    public enum Section    { Header, PageHeader, Details, PageFooter, Footer }
最重要的说明:(没有这个我是做不出来这个设计器的)
Header -> 得出Header偏移
PageHeader -> 每一页打印,受Header偏移影响
Details -> 循环,得出打印总页数,得出Details偏移,受Header偏移影响
PageFooter -> 每一页打印,受Header偏移影响,受Details偏移影响
Footer -> 最后一页打印
4.  详细、打印页数的实现:
A. 只有Grid才能设置为Details,打印页数是通过数据源以及Grid的配置算出来的
B. FixedCount和MaxPrePageCount的区别在于,FixedCount是指定没数据时也要打印,我想你应该猜到MaxPrePageCount的作用了,有多少数据就打印多少数据,此时PageFooter和Footer的所有控件比如Label就会跟随在尾后,也就是随着数据源的多少而决定他们的位置
C. 打印页数也会跟Grid的记录级判断有关,详细看下面
 
5.  本页小计、合计和金额大小写
A. 本页小计的金额大小写转换(把本页小计传进金额转换函数则可)
B. 合计的金额大小写转换(同上)
C. 本页小计的每个位上的金额大小写转换(取某位然后取得转换)
6.  打印判断以及详细里面每一次记录的打印判断
A. Header、Footer都是属于固定页(第一页和最后一页才打印)的,有些非固定比如偶数页打印的判断则需要打印判断了,打印判断我用到的是动态编译(这个太慢希望有人能提供一个自己写MinC#的编译器,谢谢)。
B. 对于Grid的记录级打印判断,这个业务确实是有这样的要求,上面图中也正是这样。
这种情况下,在计算页数前,也就是在打印前就算出总页数,然后在打印时跳过则可,实现也比较简单。
7.  操作方便的改进
A. 复制、粘贴,鼠标拖动、修改大小,当然还可以多选几个来操作。
B. 少不了的左、右、上、下对齐,然后是从左到右平均分布、从上到下平均分布
C. 最后面的手是可以拖动打印界面整个(哈哈,方便我自己的,项目当时一个打印界面很大,太麻烦就加上去了)
8.  中文、英文自动排版问题:
做过打印的人都知道打印文章时排版就成了问题了,界面中使用IsDocument就可以自动实现像Word差不多的排版,虽然还没做到很智能。

解决方案 »

  1.   

    我在打印场合倾向于把要的内容写成一个 pdf 或者类似的其他开放格式,然后用户爱怎么打印打印去
      

  2.   

    什么WINFORM之二,这和WINFORM无关呀,乱起标题
      

  3.   


    不好意思,这个。。怎么和Winform无关呢?
      

  4.   

    比如水晶报表,只有WINFORM的吗,WEBforM也有,你谈了2节内容,有谈到WINFORM的东西吗。
      

  5.   


    不发后续,没什么人对Winform感兴趣,省些时间做研究吧.谢谢
      

  6.   

    楼主能给源码吗?[email protected]