您的位置:首页 > 编程语言 > C#

C#中使用GDI+与PrintDocument实现打印

2011-05-19 22:02 666 查看
近日做报表,需要实现一个比较特殊的打印:针对不同患者的药费记录,打印不同的清单,并且支持一次打印多个患者的记录。其效果看起来应该像下面这个样子:
如上所述,使用弱智的水晶报表,就会遇到如何构造数据源的问题,由于不同患者的药费记录和遗嘱记录都不同,而且整体上需要一个患者一个清单,所以其数据源只能为一个数组,而不是简单的DataTable。小弟一向对大且笨拙的CrystalReport不感冒,再加上对GDI+比较痴迷,索性费点功夫,使用GDI+来打印上述报表。
首先需要构造数据源,创建一个ArrayList对象a,然后再把每个患者需要打印的东东保存为一个ArrayList放入ATotal中。

1if (a != null)
2for (int m = 0; m < 3; m++)
6Size sTotal = new Size(420, e.PageBounds.Height);
2Graphics g = e.Graphics;
3Font fTitle = new Font("宋体", 16); // 标题字体
4int titleHeight = 20; // 标题的高度
5int textHeight = 13; // 普通文本的高度
6Font fText = new Font("宋体", 9); // 文本字体
7
8int top = 30; // 顶部间距
9int left = 10; // 左边距
10int right = 10; // 右边距
11int titleMargin = 15; // 标题和正文行间距
12int textMargin = 5; // 行间距
13int rectangleMargin = 3; // 边框和文本间距
14int oneHeight = 19; // 一行文本 + 2 * 行间距的高度
15int oneWidth = sTotal.Width - left - right; // 打印内容的宽度
16
17int y = 0;
18while (j < a.Count) // Count为要打印的患者个数
19j = 0; // 打印完毕
253e.HasMorePages = false;
判断一行内容是否已经打印过:

1private bool JudgeString( string s )
7
16将已经打印过的内容标记为已打印
17private void AddPrintedSign( ref string s )
22{
23 int l = s.Length;
24 s = s.Replace( s.Substring( l - 1, 1 ), "*" );
25}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: