实现DataGridView的打印
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Text;
7
using System.Windows.Forms;
8
using System.Drawing.Printing;
9
using System.IO;
10
11
namespace XXX
12
13

{
14
/**//// <summary>
15
/// 实现DataGridView的打印
16
/// </summary>
17
public class PrintDataGridView
18
{
19
private static List<DataGridViewCellPrint> CellPrintList = new List<DataGridViewCellPrint>();
20
21
private static int printRowCount = 0;
22
23
private static bool IsPrint = true;
24
private static bool IsRole = true;
25
private static int PoXTmp = 0;
26
private static int PoYTmp = 0;
27
private static int WidthTmp = 0;
28
private static int HeightTmp = 0;
29
private static int RowIndex = 0;
30
31
/**//// <summary>
32
/// 打印DataGridView控件
33
/// </summary>
34
/// <param name="dataGridView">DataGridView控件</param>
35
/// <param name="includeColumnText">是否包括列标题</param>
36
/// <param name="e">为 System.Drawing.Printing.PrintDocument.PrintPage 事件提供数据。</param>
37
/// <param name="PoX">起始X坐标</param>
38
/// <param name="PoY">起始Y坐标</param>
39
public static void Print(DataGridView dataGridView, bool includeColumnText, PrintPageEventArgs e, ref int PoX, ref int PoY)
40
{
41
try
42
{
43
if (PrintDataGridView.IsPrint)
44
{
45
PrintDataGridView.printRowCount = 0;
46
PrintDataGridView.IsPrint = false;
47
PrintDataGridView.DataGridViewCellVsList(dataGridView, includeColumnText);
48
if (0 == PrintDataGridView.CellPrintList.Count)
49
return;
50
if (PoX > e.MarginBounds.Left)
51
PrintDataGridView.IsRole = true;
52
else
53
PrintDataGridView.IsRole = false;
54
PrintDataGridView.PoXTmp = PoX;
55
PrintDataGridView.PoYTmp = PoY;
56
PrintDataGridView.RowIndex = 0;
57
WidthTmp = 0;
58
HeightTmp = 0;
59
}
60
if (0 != PrintDataGridView.printRowCount)
61
{
62
if (IsRole)
63
{
64
PoX = PoXTmp = e.MarginBounds.Left;
65
PoY = PoYTmp = e.MarginBounds.Top;
66
}
67
else
68
{
69
PoX = PoXTmp;
70
PoY = PoYTmp;
71
}
72
}
73
while (PrintDataGridView.printRowCount < PrintDataGridView.CellPrintList.Count)
74
{
75
DataGridViewCellPrint CellPrint = CellPrintList[PrintDataGridView.printRowCount];
76
if (RowIndex == CellPrint.RowIndex)
77
PoX = PoX + WidthTmp;
78
else
79
{
80
PoX = PoXTmp;
81
PoY = PoY + HeightTmp;
82
if (PoY + HeightTmp > e.MarginBounds.Bottom)
83
{
84
HeightTmp = 0;
85
e.HasMorePages = true;
86
return;
87
}
88
}
89
using (SolidBrush solidBrush = new SolidBrush(CellPrint.BackColor))
90
{
91
RectangleF rectF1 = new RectangleF(PoX, PoY, CellPrint.Width, CellPrint.Height);
92
e.Graphics.FillRectangle(solidBrush, rectF1);
93
using (Pen pen = new Pen(Color.Black, 1))
94
e.Graphics.DrawRectangle(pen, Rectangle.Round(rectF1));
95
solidBrush.Color = CellPrint.ForeColor;
96
e.Graphics.DrawString(CellPrint.FormattedValue, CellPrint.Font, solidBrush, new Point(PoX + 2, PoY + 3));
97
}
98
WidthTmp = CellPrint.Width;
99
HeightTmp = CellPrint.Height;
100
RowIndex = CellPrint.RowIndex;
101
PrintDataGridView.printRowCount++;
102
}
103
PoY = PoY + HeightTmp;
104
e.HasMorePages = false;
105
PrintDataGridView.IsPrint = true;
106
}
107
catch
108
{
109
e.HasMorePages = false;
110
PrintDataGridView.IsPrint = true;
111
throw;
112
}
113
114
}
115
116
/**//// <summary>
117
/// 将DataGridView控件内容转变到 CellPrintList
118
/// </summary>
119
/// <param name="dataGridView">DataGridView控件</param>
120
/// <param name="includeColumnText">是否包括列标题</param>
121
private static void DataGridViewCellVsList(DataGridView dataGridView, bool includeColumnText)
122
{
123
CellPrintList.Clear();
124
try
125
{
126
int rowsCount = dataGridView.Rows.Count;
127
int colsCount = dataGridView.Columns.Count;
128
129
//最后一行是供输入的行时,不用读数据。
130
if (dataGridView.Rows[rowsCount - 1].IsNewRow)
131
rowsCount--;
132
//包括列标题
133
if (includeColumnText)
134
{
135
for (int columnsIndex = 0; columnsIndex < colsCount; columnsIndex++)
136
{
137
if (dataGridView.Columns[columnsIndex].Visible)
138
{
139
DataGridViewCellPrint CellPrint = new DataGridViewCellPrint();
140
CellPrint.FormattedValue = dataGridView.Columns[columnsIndex].HeaderText;
141
CellPrint.RowIndex = 0;
142
CellPrint.ColumnIndex = columnsIndex;
143
CellPrint.Font = dataGridView.Columns[columnsIndex].HeaderCell.Style.Font;
144
CellPrint.BackColor = dataGridView.ColumnHeadersDefaultCellStyle.BackColor;
145
CellPrint.ForeColor = dataGridView.ColumnHeadersDefaultCellStyle.ForeColor;
146
CellPrint.Width = dataGridView.Columns[columnsIndex].Width;
147
CellPrint.Height = dataGridView.ColumnHeadersHeight;
148
CellPrintList.Add(CellPrint);
149
}
150
}
151
}
152
//读取单元格数据
153
for (int rowIndex = 0; rowIndex < rowsCount; rowIndex++)
154
{
155
for (int columnsIndex = 0; columnsIndex < colsCount; columnsIndex++)
156
{
157
if (dataGridView.Columns[columnsIndex].Visible)
158
{
159
DataGridViewCellPrint CellPrint = new DataGridViewCellPrint();
160
CellPrint.FormattedValue = dataGridView.Rows[rowIndex].Cells[columnsIndex].FormattedValue.ToString();
161
if (includeColumnText)
162
CellPrint.RowIndex = rowIndex + 1;//假如包括列标题则从行号1开始
163
else
164
CellPrint.RowIndex = rowIndex;
165
CellPrint.ColumnIndex = columnsIndex;
166
CellPrint.Font = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.Font;
167
System.Drawing.Color TmpColor = System.Drawing.Color.Empty;
168
if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.BackColor)
169
TmpColor = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.BackColor;
170
else if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].DefaultCellStyle.BackColor)
171
TmpColor = dataGridView.Rows[rowIndex].DefaultCellStyle.BackColor;
172
else
173
TmpColor = dataGridView.DefaultCellStyle.BackColor;
174
CellPrint.BackColor = TmpColor;
175
TmpColor = System.Drawing.Color.Empty;
176
if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.ForeColor)
177
TmpColor = dataGridView.Rows[rowIndex].Cells[columnsIndex].Style.ForeColor;
178
else if (System.Drawing.Color.Empty != dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor)
179
TmpColor = dataGridView.Rows[rowIndex].DefaultCellStyle.ForeColor;
180
else
181
TmpColor = dataGridView.DefaultCellStyle.ForeColor;
182
CellPrint.ForeColor = TmpColor;
183
CellPrint.Width = dataGridView.Columns[columnsIndex].Width;
184
CellPrint.Height = dataGridView.Rows[rowIndex].Height;
185
CellPrintList.Add(CellPrint);
186
}
187
}
188
}
189
}
190
catch
{ throw; }
191
}
192
193
private class DataGridViewCellPrint
194
{
195
private string _FormattedValue = "";
196
private int _RowIndex = -1;
197
private int _ColumnIndex = -1;
198
private System.Drawing.Color _ForeColor = System.Drawing.Color.Black;
199
private System.Drawing.Color _BackColor = System.Drawing.Color.White;
200
private int _Width = 100;
201
private int _Height = 23;
202
private System.Drawing.Font _Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
203
/**//// <summary>
204
/// 获取或设置单元格的字体。
205
/// </summary>
206
public System.Drawing.Font Font
207
{
208
set
{ if (null != value) _Font = value; }
209
get
{ return _Font; }
210
}
211
/**//// <summary>
212
/// 获取为显示进行格式化的单元格的值。
213
/// </summary>
214
public string FormattedValue
215
{
216
set
{ _FormattedValue = value; }
217
get
{ return _FormattedValue; }