在windows應用程序中文檔的打印是一項非常重要的功能,在以前一直是一個非常復雜的工作,Microsoft .Net Framework的打印功能都以組件的方式提供,為程序員提供了很大的方便。由於工作中常用到印功功能,個人寫了一個專門打印DataGridView對象一個類,可以實現預覽和打印功能,而且自動縮放字段、添加顏色;在預覽時可以根據不同的比例查看效果,可以查看第幾頁數據和直接打印第幾頁的 數據。請看效果圖。
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Drawing.Printing;
6 using System.Windows.Forms;
7 using System.Drawing;
8 using Dys.Component;
9 namespace Bll
10 {
11 /// <summary>
12 /// 打印
13 /// 開心懶人
14 /// 2014-10-10
15 /// </summary>
16 public class PrintDataGridView
17 {
18
19 static DataGridView dgv;
20 static string titleName = ""; //標題名稱
21 static string titleName2 = ""; //第二標題名稱
22 static int rowIndex = 0; //當前行
23 static int page = 1; //當前頁
24 static int rowsPerPage = 0; //每頁顯示多少行
25 /// <summary>
26 /// 打印DataGridView
27 /// </summary>
28 /// <param name="dataGridView">要打印的DataGridView</param>
29 /// <param name="title">標題</param>
30 /// <param name="title2">第二標題,可以為null</param>
31 public static void Print(DataGridView dataGridView, string title, string title2)
32 {
33 try
34 {
35 if (dataGridView == null) { return; }
36 titleName = title;
37 titleName2 = title2;
38 dgv = dataGridView;
39 PrintPreviewDialog ppvw = new PrintPreviewDialog();
40 ppvw.PrintPreviewControl.Zoom = 1.0; //顯示比例為100%
41 PrintDocument printDoc = new PrintDocument();
42 PrintDialog MyDlg = new PrintDialog();
43 MyDlg.Document = printDoc;
44 printDoc.DefaultPageSettings.PaperSize = new PaperSize("A4", 850, 1000);
45 printDoc.DefaultPageSettings.Margins = new Margins(60, 60, 60, 60); //設置邊距
46 ppvw.Document = printDoc; //設置要打印的文檔
47 ((Form)ppvw).WindowState = FormWindowState.Maximized; //最大化
48 rowIndex = 0; //當前行
49 page = 1; //當前頁
50 printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage); //打印事件
51 printDoc.EndPrint += new PrintEventHandler(printDoc_EndPrint);
52 ppvw.Document.DefaultPageSettings.Landscape = true; // 設置打印為橫向
53 ppvw.ShowDialog(); //打開預覽
54
55 }
56 catch (Exception ex)
57 {
58 MessageBox.Show(ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
59 }
60
61 }
62
63 static void printDoc_EndPrint(object sender, PrintEventArgs e)
64 {
65 rowIndex = 0; //當前行
66 page = 1; //當前頁
67 rowsPerPage = 0;//每頁顯示多少行
68 }
69 private static void printDoc_PrintPage(object sender, PrintPageEventArgs e)
70 {
71
72 //標題字體
73 Font titleFont = new Font("微軟雅黑", 16, FontStyle.Bold);
74 //標題尺寸
75 SizeF titleSize = e.Graphics.MeasureString(titleName, titleFont, e.MarginBounds.Width);
76 //x坐標
77 int x = e.MarginBounds.Left;
78 //y坐標
79 int y = Convert.ToInt32(e.MarginBounds.Top - titleSize.Height);
80 //邊距以內紙張寬度
81 int pagerWidth = e.MarginBounds.Width;
82 //畫標題
83 e.Graphics.DrawString(titleName, titleFont, Brushes.Black, x + (pagerWidth - titleSize.Width) / 2, y);
84 y += (int)titleSize.Height;
85 if (titleName2 != null && titleName2 != "")
86 {
87
88 //畫第二標題
89 e.Graphics.DrawString(titleName2, dgv.Font, Brushes.Black, x + (pagerWidth - titleSize.Width) / 2 + 200, y);
90 //第二標題尺寸
91 SizeF titleSize2 = e.Graphics.MeasureString(titleName2, dgv.Font, e.MarginBounds.Width);
92 y += (int)titleSize2.Height;
93
94 }
95
96 //表頭高度
97 int headerHeight = 0;
98 //縱軸上 內容與線的距離
99 int padding = 6;
100 //所有顯示列的寬度
101 int columnsWidth = 0;
102 //計算所有顯示列的寬度
103 foreach (DataGridViewColumn column in dgv.Columns)
104 {
105
106 //隱藏列返回
107 if (!column.Visible) continue;
108 //所有顯示列的寬度
109 columnsWidth += column.Width;
110 }
111
112 //計算表頭高度
113 foreach (DataGridViewColumn column in dgv.Columns)
114 {
115
116 //列寬
117 int columnWidth = (int)(Math.Floor((double)column.Width / (double)columnsWidth * (double)pagerWidth));
118 //表頭高度
119 int temp = (int)e.Graphics.MeasureString(column.HeaderText, column.InheritedStyle.Font, columnWidth).Height + 2 * padding;
120 if (temp > headerHeight) headerHeight = temp;
121 }
122
123 //畫表頭
124
125 foreach (DataGridViewColumn column in dgv.Columns)
126 {
127
128 //隱藏列返回
129 if (!column.Visible) continue;
130 //列寬
131 int columnWidth = (int)(Math.Floor((double)column.Width / (double)columnsWidth * (double)pagerWidth));
132 //內容居中要加的寬度
133 float cenderWidth = (columnWidth - e.Graphics.MeasureString(column.HeaderText, column.InheritedStyle.Font, columnWidth).Width) / 2;
134 if (cenderWidth < 0) cenderWidth = 0;
135 //內容居中要加的高度
136 float cenderHeight = (headerHeight + padding - e.Graphics.MeasureString(column.HeaderText, column.InheritedStyle.Font, columnWidth).Height) / 2;
137 if (cenderHeight < 0) cenderHeight = 0;
138 //畫背景
139 e.Graphics.FillRectangle(new SolidBrush(Color.LightGray), new Rectangle(x, y, columnWidth, headerHeight));
140 //畫邊框
141 e.Graphics.DrawRectangle(Pens.Black, new Rectangle(x, y, columnWidth, headerHeight));
142 ////畫上邊線
143
144 //e.Graphics.DrawLine(Pens.Black, x, y, x + columnWidth, y);
145
146 ////畫下邊線
147
148 //e.Graphics.DrawLine(Pens.Black, x, y + headerHeight, x + columnWidth, y + headerHeight);
149
150 ////畫右邊線
151
152 //e.Graphics.DrawLine(Pens.Black, x + columnWidth, y, x + columnWidth, y + headerHeight);
153
154 //if (x == e.MarginBounds.Left)
155
156 //{
157
158 // //畫左邊線
159
160 // e.Graphics.DrawLine(Pens.Black, x, y, x, y + headerHeight);
161
162 //}
163
164 //畫內容
165 e.Graphics.DrawString(column.HeaderText, column.InheritedStyle.Font, new SolidBrush(column.InheritedStyle.ForeColor), new RectangleF(x + cenderWidth, y + cenderHeight, columnWidth, headerHeight));
166 x += columnWidth;
167
168 }
169
170 x = e.MarginBounds.Left;
171 y += headerHeight;
172 while (rowIndex < dgv.Rows.Count)
173 {
174
175 DataGridViewRow row = dgv.Rows[rowIndex];
176 if (row.Visible)
177 {
178
179 int rowHeight = 0;
180 foreach (DataGridViewCell cell in row.Cells)
181 {
182
183 DataGridViewColumn column = dgv.Columns[cell.ColumnIndex];
184 if (!column.Visible || cell.Value == null) continue;
185 int tmpWidth = (int)(Math.Floor((double)column.Width / (double)columnsWidth * (double)pagerWidth));
186 int temp = (int)e.Graphics.MeasureString(cell.Value.ToString(), column.InheritedStyle.Font, tmpWidth).Height + 2 * padding;
187 if (temp > rowHeight) rowHeight = temp;
188 }
189
190 foreach (DataGridViewCell cell in row.Cells)
191 {
192
193 DataGridViewColumn column = dgv.Columns[cell.ColumnIndex];
194 if (!column.Visible) continue;
195 int columnWidth = (int)(Math.Floor((double)column.Width / (double)columnsWidth * (double)pagerWidth));
196 e.Graphics.DrawRectangle(Pens.Black, new Rectangle(x, y, columnWidth, rowHeight));
197
198 if (cell.Value != null)
199 {
200
201 //內容居中要加的寬度
202
203 float cenderWidth = (columnWidth - e.Graphics.MeasureString(cell.Value.ToString(), cell.InheritedStyle.Font, columnWidth).Width) / 2;
204
205 if (cenderWidth < 0) cenderWidth = 0;
206
207 //內容居中要加的高度
208
209 float cenderHeight = (rowHeight + padding - e.Graphics.MeasureString(cell.Value.ToString(), cell.InheritedStyle.Font, columnWidth).Height) / 2;
210
211 if (cenderHeight < 0) cenderHeight = 0;
212
213 ////畫下邊線
214
215 //e.Graphics.DrawLine(Pens.Black, x, y + rowHeight, x + columnWidth, y + rowHeight);
216
217 ////畫右邊線
218
219 //e.Graphics.DrawLine(Pens.Black, x + columnWidth, y, x + columnWidth, y + rowHeight);
220
221 //if (x == e.MarginBounds.Left)
222
223 //{
224
225 // //畫左邊線
226
227 // e.Graphics.DrawLine(Pens.Black, x, y, x, y + rowHeight);
228
229 //}
230
231 //畫內容
232
233 e.Graphics.DrawString(cell.Value.ToString(), column.InheritedStyle.Font, new SolidBrush(cell.InheritedStyle.ForeColor), new RectangleF(x + cenderWidth, y + cenderHeight, columnWidth, rowHeight));
234
235 }
236
237 x += columnWidth;
238
239 }
240
241 x = e.MarginBounds.Left;
242
243 y += rowHeight;
244
245 if (page == 1) rowsPerPage++;
246
247 //打印下一頁
248
249 if (y + rowHeight > e.MarginBounds.Bottom)
250 {
251
252 e.HasMorePages = true;
253
254 break;
255
256 }
257
258 }
259
260 rowIndex++;
261
262 }
263
264 //頁腳
265 string footer = " 第 " + page + " 頁,共 " + Math.Ceiling(((double)dgv.Rows.Count / rowsPerPage)).ToString() + " 頁";
266 //畫頁腳
267 e.Graphics.DrawString(footer, dgv.Font, Brushes.Black, x + (pagerWidth - e.Graphics.MeasureString(footer, dgv.Font).Width) / 2, e.MarginBounds.Bottom);
268 page++;
269
270 }
271
272
273 }
274
275 }
View Code