heting
BlogJava
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
40 随笔 :: 9 文章 :: 45 评论 :: 0 Trackbacks
<
2010年4月
>
日
一
二
三
四
五
六
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(3)
给我留言
查看公开留言
查看私人留言
随笔分类
c#范例(4)
(rss)
java范例
(rss)
js(3)
(rss)
linux(1)
(rss)
WebSphere(1)
(rss)
数据库(3)
(rss)
随笔档案
2010年10月 (1)
2010年8月 (5)
2010年3月 (2)
2009年11月 (2)
2009年9月 (1)
2009年8月 (1)
2009年7月 (2)
2009年5月 (1)
2009年4月 (3)
2009年3月 (4)
2009年2月 (1)
2009年1月 (3)
2008年12月 (2)
2008年11月 (7)
2008年10月 (4)
2008年9月 (1)
文章档案
2008年9月 (9)
搜索
最新评论
1. re: struts2+freemarker中防止表单的重复提交token
@51互联云-济南程序猿
你什么都不懂,瞎说
--人
2. re: struts2+freemarker中防止表单的重复提交token
没关系,大家好,什么都没有
--人
3. re: struts2+freemarker中防止表单的重复提交token
套头
--人
4. re: struts2+freemarker中防止表单的重复提交token
评论内容较长,点击标题查看
--51互联云-济南程序猿
5. re: struts1文件上传和下载
评论内容较长,点击标题查看
--zuidaima
阅读排行榜
1. struts1文件上传和下载(21124)
2. javax.naming.CommunicationException 的一个相关异常(已解决)(11540)
3. 自己写的一个c#winform打印类(8474)
4. C# 与 C++ 数据类型比较及结构体转换 (7199)
5. WebSphere7.0 上部署struts2 找不到用于处理 JSP 的扩展处理器(2967)
评论排行榜
1. struts1文件上传和下载(23)
2. 自己写的一个c#winform打印类(8)
3. struts2+freemarker中防止表单的重复提交token(6)
4. Ireport在浏览器中的显示代码(2)
5. EJ3.0将EJB程序和WEb程序发布到weblogic10.3是出现的错误weblogic.wsee.async.AsyncResponseBean(2)
自己写的一个c#winform打印类
1
using
System;
2
using
System.Collections.Generic;
3
using
System.Text;
4
using
System.Windows.Forms;
5
using
System.Drawing.Printing;
6
using
System.Drawing;
7
8
namespace
Etaocn.Util
9
{
10
/**/
///
<summary>
11
///
创建人 贺挺
12
///
</summary>
13
public
class
Printer
14
{
15
private
DataGridView dataview;
16
private
PrintDocument printDoc;
17
//
打印有效区域的宽度
18
int
width;
19
int
height;
20
int
columns;
21
double
Rate;
22
bool
hasMorePage
=
false
;
23
int
currRow
=
0
;
24
int
rowHeight
=
20
;
25
//
打印页数
26
int
PageNumber;
27
//
当前打印页的行数
28
int
pageSize
=
20
;
29
//
当前打印的页码
30
int
PageIndex;
31
32
private
int
PageWidth;
//
打印纸的宽度
33
private
int
PageHeight;
//
打印纸的高度
34
private
int
LeftMargin;
//
有效打印区距离打印纸的左边大小
35
private
int
TopMargin;
//
有效打印区距离打印纸的上面大小
36
private
int
RightMargin;
//
有效打印区距离打印纸的右边大小
37
private
int
BottomMargin;
//
有效打印区距离打印纸的下边大小
38
39
int
rows;
40
41
/**/
///
<summary>
42
///
构造函数
43
///
</summary>
44
///
<param name="dataview">
要打印的DateGridView
</param>
45
///
<param name="printDoc">
PrintDocument用于获取打印机的设置
</param>
46
public
Printer(DataGridView dataview, PrintDocument printDoc)
47
{
48
this
.dataview
=
dataview;
49
this
.printDoc
=
printDoc;
50
PageIndex
=
0
;
51
//
获取打印数据的具体行数
52
this
.rows
=
dataview.RowCount;
53
54
this
.columns
=
dataview.ColumnCount;
55
//
判断打印设置是否是横向打印
56
if
(
!
printDoc.DefaultPageSettings.Landscape)
57
{
58
59
PageWidth
=
printDoc.DefaultPageSettings.PaperSize.Width;
60
PageHeight
=
printDoc.DefaultPageSettings.PaperSize.Height;
61
62
}
63
else
64
{
65
66
PageHeight
=
printDoc.DefaultPageSettings.PaperSize.Width;
67
PageWidth
=
printDoc.DefaultPageSettings.PaperSize.Height;
68
69
}
70
LeftMargin
=
printDoc.DefaultPageSettings.Margins.Left;
71
TopMargin
=
printDoc.DefaultPageSettings.Margins.Top;
72
RightMargin
=
printDoc.DefaultPageSettings.Margins.Right;
73
BottomMargin
=
printDoc.DefaultPageSettings.Margins.Bottom;
74
75
76
height
=
PageHeight
-
TopMargin
-
BottomMargin
-
2
;
77
width
=
PageWidth
-
LeftMargin
-
RightMargin
-
2
;
78
79
double
tempheight
=
height;
80
double
temprowHeight
=
rowHeight;
81
while
(
true
)
82
{
83
string
temp
=
Convert.ToString(tempheight
/
Math.Round(temprowHeight,
3
));
84
int
i
=
temp.IndexOf(
'
.
'
);
85
double
tt
=
100
;
86
if
(i
!=
-
1
)
87
{
88
tt
=
Math.Round(Convert.ToDouble(temp.Substring(temp.IndexOf(
'
.
'
))),
3
);
89
}
90
if
(tt
<=
0.01
)
91
{
92
rowHeight
=
Convert.ToInt32(temprowHeight);
93
break
;
94
}
95
else
96
{
97
temprowHeight
=
temprowHeight
+
0.01
;
98
99
}
100
}
101
pageSize
=
height
/
rowHeight;
102
if
((rows
+
1
)
<=
pageSize)
103
{
104
pageSize
=
rows
+
1
;
105
PageNumber
=
1
;
106
}
107
else
108
{
109
PageNumber
=
rows
/
(pageSize
-
1
);
110
if
(rows
%
(pageSize
-
1
)
!=
0
)
111
{
112
PageNumber
=
PageNumber
+
1
;
113
}
114
115
}
116
117
118
119
}
120
121
122
123
/**/
///
<summary>
124
///
初始化打印
125
///
</summary>
126
private
void
InitPrint()
127
{
128
PageIndex
=
PageIndex
+
1
;
129
if
(PageIndex
==
PageNumber)
130
{
131
hasMorePage
=
false
;
132
if
(PageIndex
!=
1
)
133
{
134
pageSize
=
rows
%
(pageSize
-
1
)
+
1
;
135
}
136
}
137
else
138
{
139
hasMorePage
=
true
;
140
}
141
142
143
144
}
145
//
打印头
146
private
void
DrawHeader(Graphics g)
147
{
148
149
Font font
=
new
Font(
"
宋体
"
,
12
, FontStyle.Bold);
150
int
temptop
=
(rowHeight
/
2
)
+
TopMargin
+
1
;
151
int
templeft
=
LeftMargin
+
1
;
152
153
for
(
int
i
=
0
; i
<
this
.columns; i
++
)
154
{
155
string
headString
=
this
.dataview.Columns[i].HeaderText;
156
float
fontHeight
=
g.MeasureString(headString, font).Height;
157
float
fontwidth
=
g.MeasureString(headString, font).Width;
158
float
temp
=
temptop
-
(fontHeight)
/
3
;
159
g.DrawString(headString, font, Brushes.Black,
new
PointF(templeft, temp));
160
templeft
=
templeft
+
(
int
)(
this
.dataview.Columns[i].Width
/
Rate)
+
1
;
161
}
162
163
}
164
//
画表格
165
private
void
DrawTable(Graphics g)
166
{
167
168
Rectangle border
=
new
Rectangle(LeftMargin, TopMargin, width, (pageSize)
*
rowHeight);
169
g.DrawRectangle(
new
Pen(Brushes.Black,
2
), border);
170
for
(
int
i
=
1
; i
<
pageSize; i
++
)
171
{
172
if
(i
!=
1
)
173
{
174
g.DrawLine(
new
Pen(Brushes.Black,
1
),
new
Point(LeftMargin
+
1
, (rowHeight
*
i)
+
TopMargin
+
1
),
new
Point(width
+
LeftMargin, (rowHeight
*
i)
+
TopMargin
+
1
));
175
}
176
else
177
{
178
g.DrawLine(
new
Pen(Brushes.Black,
2
),
new
Point(LeftMargin
+
1
, (rowHeight
*
i)
+
TopMargin
+
1
),
new
Point(width
+
LeftMargin, (rowHeight
*
i)
+
TopMargin
+
1
));
179
}
180
}
181
182
//
计算出列的总宽度和打印纸比率
183
Rate
=
Convert.ToDouble(GetDateViewWidth())
/
Convert.ToDouble(width);
184
int
tempLeft
=
LeftMargin
+
1
;
185
int
endY
=
(pageSize)
*
rowHeight
+
TopMargin;
186
for
(
int
i
=
1
; i
<
columns; i
++
)
187
{
188
tempLeft
=
tempLeft
+
1
+
(
int
)(
this
.dataview.Columns[i
-
1
].Width
/
Rate);
189
g.DrawLine(
new
Pen(Brushes.Black,
1
),
new
Point(tempLeft, TopMargin),
new
Point(tempLeft, endY));
190
}
191
192
}
193
/**/
///
<summary>
194
///
获取打印的列的总宽度
195
///
</summary>
196
///
<returns></returns>
197
private
int
GetDateViewWidth()
198
{
199
int
total
=
0
;
200
for
(
int
i
=
0
; i
<
this
.columns; i
++
)
201
{
202
total
=
total
+
this
.dataview.Columns[i].Width;
203
}
204
return
total;
205
}
206
207
//
打印行数据
208
private
void
DrawRows(Graphics g)
209
{
210
211
Font font
=
new
Font(
"
宋体
"
,
12
, FontStyle.Regular);
212
int
temptop
=
(rowHeight
/
2
)
+
TopMargin
+
1
+
rowHeight;
213
214
215
for
(
int
i
=
currRow; i
<
pageSize
+
currRow
-
1
; i
++
)
216
{
217
int
templeft
=
LeftMargin
+
1
;
218
for
(
int
j
=
0
; j
<
columns; j
++
)
219
{
220
string
headString
=
this
.dataview.Rows[i].Cells[j].Value.ToString();
221
float
fontHeight
=
g.MeasureString(headString, font).Height;
222
float
fontwidth
=
g.MeasureString(headString, font).Width;
223
float
temp
=
temptop
-
(fontHeight)
/
3
;
224
while
(
true
)
225
{
226
if
(fontwidth
<=
(
int
)(
this
.dataview.Columns[j].Width
/
Rate))
227
{
228
break
;
229
}
230
else
231
{
232
headString
=
headString.Substring(
0
, headString.Length
-
1
);
233
fontwidth
=
g.MeasureString(headString, font).Width;
234
}
235
}
236
g.DrawString(headString, font, Brushes.Black,
new
PointF(templeft, temp));
237
238
templeft
=
templeft
+
(
int
)(
this
.dataview.Columns[j].Width
/
Rate)
+
1
;
239
}
240
241
temptop
=
temptop
+
rowHeight;
242
243
244
}
245
currRow
=
pageSize
+
currRow
-
1
;
246
247
}
248
249
/**/
///
<summary>
250
///
在PrintDocument中的PrintPage方法中调用
251
///
</summary>
252
///
<param name="g">
传入PrintPage中PrintPageEventArgs中的Graphics
</param>
253
///
<returns>
是否还有打印页 有返回true,无则返回false
</returns>
254
public
bool
Print(Graphics g)
255
{
256
InitPrint();
257
DrawTable(g);
258
DrawHeader(g);
259
DrawRows(g);
260
261
//
打印页码
262
string
pagestr
=
PageIndex
+
"
/
"
+
PageNumber;
263
Font font
=
new
Font(
"
宋体
"
,
12
, FontStyle.Regular);
264
g.DrawString(pagestr, font, Brushes.Black,
new
PointF((PageWidth
/
2
)
-
g.MeasureString(pagestr, font).Width, PageHeight
-
(BottomMargin
/
2
)
-
g.MeasureString(pagestr, font).Height));
265
//
打印查询的功能项名称
266
string
temp
=
dataview.Tag.ToString()
+
"
"
+
DateTime.Now.ToString(
"
yyyy-MM-dd HH:mm
"
);
267
g.DrawString(temp, font, Brushes.Black,
new
PointF(PageWidth
-
5
-
g.MeasureString(temp, font).Width, PageHeight
-
5
-
g.MeasureString(temp, font).Height));
268
return
hasMorePage;
269
}
270
271
272
273
274
275
276
}
277
}
278
posted on 2009-09-19 09:46
贺挺
阅读(8474)
评论(8)
编辑
收藏
所属分类:
c#范例
评论
#
re: 自己写的一个c#winform打印类
2009-09-20 11:41
罗莱家纺
是打开附件是的看见飞机快斯蒂芬
回复
更多评论
#
re: 自己写的一个c#winform打印类
2009-09-27 15:08
周志勇
兄弟能不能写一个应用实例,这样有学习的榜样与例子,我的QQ879947263
回复
更多评论
#
re: 自己写的一个c#winform打印类
2010-01-07 20:47
12
你好我些问题要问你!!
回复
更多评论
#
re: 自己写的一个c#winform打印类
2010-01-07 20:48
12
你好
我需要你的帮助!!
494961597
回复
更多评论
#
re: 自己写的一个c#winform打印类[未登录]
2010-02-02 22:37
KK
大哥,一复制都是行号,这样很累的的呀
回复
更多评论
#
re: 自己写的一个c#winform打印类
2010-02-25 16:08
43
全是行号,没法看代码
回复
更多评论
#
re: 自己写的一个c#winform打印类
2010-04-27 17:54
roro
你敢不敢不显示行号
回复
更多评论
#
re: 自己写的一个c#winform打印类[未登录]
2011-01-04 17:12
匿名
调用你的方法但是 到这一行就显示了“未将对象引用到实例化的错误” 。
string temp = dataview.Tag.ToString() + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm");
267 g.DrawString(temp, font, Brushes.Black, new PointF(PageWidth - 5 - g.MeasureString(temp, font).Width, PageHeight - 5 - g.MeasureString(temp, font).Height));“
dataview.Tag为null
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
AxWindowsMediaPlayer的详细用法
C# 与 C++ 数据类型比较及结构体转换
自己写的一个c#winform打印类
c# winform 打印类
Powered by:
BlogJava
Copyright © 贺挺