天天看點

C# winform 列印類

 1

C# winform 列印類

using System;

2

C# winform 列印類

using System.Collections.Generic;

3

C# winform 列印類

using System.Text;

4

C# winform 列印類

using System.Windows.Forms;

5

C# winform 列印類

using System.Drawing.Printing;

6

C# winform 列印類

using System.Drawing;

7

C# winform 列印類

8

C# winform 列印類

namespace Etaocn.Util

9

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

10

C# winform 列印類
C# winform 列印類

/// <summary>

11

C# winform 列印類

/// 建立人 賀挺

12

C# winform 列印類

/// </summary>

13

C# winform 列印類

public class Printer

14

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

15

C# winform 列印類

private DataGridView dataview;

16

C# winform 列印類

private PrintDocument printDoc;

17

C# winform 列印類

//列印有效區域的寬度

18

C# winform 列印類

int width;

19

C# winform 列印類

int height;

20

C# winform 列印類

int columns;

21

C# winform 列印類

double Rate;

22

C# winform 列印類

bool hasMorePage = false;

23

C# winform 列印類

int currRow = 0;

24

C# winform 列印類

int rowHeight = 20;

25

C# winform 列印類

//列印頁數

26

C# winform 列印類

int PageNumber;

27

C# winform 列印類

//目前列印頁的行數

28

C# winform 列印類

int pageSize = 20;

29

C# winform 列印類

//目前列印的頁碼

30

C# winform 列印類

int PageIndex;

31

C# winform 列印類

32

C# winform 列印類

private int PageWidth; //列印紙的寬度

33

C# winform 列印類

private int PageHeight; //列印紙的高度

34

C# winform 列印類

private int LeftMargin; //有效列印區距離列印紙的左邊大小

35

C# winform 列印類

private int TopMargin;//有效列印區距離列印紙的上面大小

36

C# winform 列印類

private int RightMargin;//有效列印區距離列印紙的右邊大小

37

C# winform 列印類

private int BottomMargin;//有效列印區距離列印紙的下邊大小

38

C# winform 列印類

39

C# winform 列印類

int rows;

40

C# winform 列印類

41

C# winform 列印類
C# winform 列印類

/// <summary>

42

C# winform 列印類

/// 構造函數

43

C# winform 列印類

/// </summary>

44

C# winform 列印類

/// <param name="dataview">要列印的DateGridView</param>

45

C# winform 列印類

/// <param name="printDoc">PrintDocument用于擷取列印機的設定</param>

46

C# winform 列印類

public Printer(DataGridView dataview, PrintDocument printDoc)

47

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

48

C# winform 列印類

this.dataview = dataview;

49

C# winform 列印類

this.printDoc = printDoc;

50

C# winform 列印類

PageIndex = 0;

51

C# winform 列印類

//擷取列印資料的具體行數

52

C# winform 列印類

this.rows = dataview.RowCount;

53

C# winform 列印類

54

C# winform 列印類

this.columns = dataview.ColumnCount;

55

C# winform 列印類

//判斷列印設定是否是橫向列印

56

C# winform 列印類

if (!printDoc.DefaultPageSettings.Landscape)

57

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

58

C# winform 列印類

59

C# winform 列印類

PageWidth = printDoc.DefaultPageSettings.PaperSize.Width;

60

C# winform 列印類

PageHeight = printDoc.DefaultPageSettings.PaperSize.Height;

61

C# winform 列印類

62

C# winform 列印類

}

63

C# winform 列印類

else

64

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

65

C# winform 列印類

66

C# winform 列印類

PageHeight = printDoc.DefaultPageSettings.PaperSize.Width;

67

C# winform 列印類

PageWidth = printDoc.DefaultPageSettings.PaperSize.Height;

68

C# winform 列印類

69

C# winform 列印類

}

70

C# winform 列印類

LeftMargin = printDoc.DefaultPageSettings.Margins.Left;

71

C# winform 列印類

TopMargin = printDoc.DefaultPageSettings.Margins.Top;

72

C# winform 列印類

RightMargin = printDoc.DefaultPageSettings.Margins.Right;

73

C# winform 列印類

BottomMargin = printDoc.DefaultPageSettings.Margins.Bottom;

74

C# winform 列印類

75

C# winform 列印類

76

C# winform 列印類

height = PageHeight - TopMargin - BottomMargin - 2;

77

C# winform 列印類

width = PageWidth - LeftMargin - RightMargin - 2;

78

C# winform 列印類

79

C# winform 列印類

double tempheight = height;

80

C# winform 列印類

double temprowHeight = rowHeight;

81

C# winform 列印類

while (true)

82

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

83

C# winform 列印類

string temp = Convert.ToString(tempheight / Math.Round(temprowHeight, 3));

84

C# winform 列印類

int i = temp.IndexOf('.');

85

C# winform 列印類

double tt = 100;

86

C# winform 列印類

if (i != -1)

87

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

88

C# winform 列印類

tt = Math.Round(Convert.ToDouble(temp.Substring(temp.IndexOf('.'))), 3);

89

C# winform 列印類

}

90

C# winform 列印類

if (tt <= 0.01)

91

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

92

C# winform 列印類

rowHeight = Convert.ToInt32(temprowHeight);

93

C# winform 列印類

break;

94

C# winform 列印類

}

95

C# winform 列印類

else

96

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

97

C# winform 列印類

temprowHeight = temprowHeight + 0.01;

98

C# winform 列印類

99

C# winform 列印類

}

100

C# winform 列印類

}

101

C# winform 列印類

pageSize = height / rowHeight;

102

C# winform 列印類

if ((rows + 1) <= pageSize)

103

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

104

C# winform 列印類

pageSize = rows + 1;

105

C# winform 列印類

PageNumber = 1;

106

C# winform 列印類

}

107

C# winform 列印類

else

108

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

109

C# winform 列印類

PageNumber = rows / (pageSize - 1);

110

C# winform 列印類

if (rows % (pageSize - 1) != 0)

111

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

112

C# winform 列印類

PageNumber = PageNumber + 1;

113

C# winform 列印類

}

114

C# winform 列印類

115

C# winform 列印類

}

116

C# winform 列印類

117

C# winform 列印類

118

C# winform 列印類

119

C# winform 列印類

}

120

C# winform 列印類

121

C# winform 列印類

122

C# winform 列印類

123

C# winform 列印類
C# winform 列印類

/// <summary>

124

C# winform 列印類

/// 初始化列印

125

C# winform 列印類

/// </summary>

126

C# winform 列印類

private void InitPrint()

127

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

128

C# winform 列印類

PageIndex = PageIndex + 1;

129

C# winform 列印類

if (PageIndex == PageNumber)

130

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

131

C# winform 列印類

hasMorePage = false;

132

C# winform 列印類

if (PageIndex != 1)

133

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

134

C# winform 列印類

pageSize = rows % (pageSize - 1) + 1;

135

C# winform 列印類

}

136

C# winform 列印類

}

137

C# winform 列印類

else

138

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

139

C# winform 列印類

hasMorePage = true;

140

C# winform 列印類

}

141

C# winform 列印類

142

C# winform 列印類

143

C# winform 列印類

144

C# winform 列印類

}

145

C# winform 列印類

//列印頭

146

C# winform 列印類

private void DrawHeader(Graphics g)

147

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

148

C# winform 列印類

149

C# winform 列印類

Font font = new Font("宋體", 12, FontStyle.Bold);

150

C# winform 列印類

int temptop = (rowHeight / 2) + TopMargin + 1;

151

C# winform 列印類

int templeft = LeftMargin + 1;

152

C# winform 列印類

153

C# winform 列印類

for (int i = 0; i < this.columns; i++)

154

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

155

C# winform 列印類

string headString = this.dataview.Columns[i].HeaderText;

156

C# winform 列印類

float fontHeight = g.MeasureString(headString, font).Height;

157

C# winform 列印類

float fontwidth = g.MeasureString(headString, font).Width;

158

C# winform 列印類

float temp = temptop - (fontHeight) / 3;

159

C# winform 列印類

g.DrawString(headString, font, Brushes.Black, new PointF(templeft, temp));

160

C# winform 列印類

templeft = templeft + (int)(this.dataview.Columns[i].Width / Rate) + 1;

161

C# winform 列印類

}

162

C# winform 列印類

163

C# winform 列印類

}

164

C# winform 列印類

//畫表格

165

C# winform 列印類

private void DrawTable(Graphics g)

166

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

167

C# winform 列印類

168

C# winform 列印類

Rectangle border = new Rectangle(LeftMargin, TopMargin, width, (pageSize) * rowHeight);

169

C# winform 列印類

g.DrawRectangle(new Pen(Brushes.Black, 2), border);

170

C# winform 列印類

for (int i = 1; i < pageSize; i++)

171

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

172

C# winform 列印類

if (i != 1)

173

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

174

C# winform 列印類

g.DrawLine(new Pen(Brushes.Black, 1), new Point(LeftMargin + 1, (rowHeight * i) + TopMargin + 1), new Point(width + LeftMargin, (rowHeight * i) + TopMargin + 1));

175

C# winform 列印類

}

176

C# winform 列印類

else

177

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

178

C# winform 列印類

g.DrawLine(new Pen(Brushes.Black, 2), new Point(LeftMargin + 1, (rowHeight * i) + TopMargin + 1), new Point(width + LeftMargin, (rowHeight * i) + TopMargin + 1));

179

C# winform 列印類

}

180

C# winform 列印類

}

181

C# winform 列印類

182

C# winform 列印類

//計算出列的總寬度和列印紙比率

183

C# winform 列印類

Rate = Convert.ToDouble(GetDateViewWidth()) / Convert.ToDouble(width);

184

C# winform 列印類

int tempLeft = LeftMargin + 1;

185

C# winform 列印類

int endY = (pageSize) * rowHeight + TopMargin;

186

C# winform 列印類

for (int i = 1; i < columns; i++)

187

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

188

C# winform 列印類

tempLeft = tempLeft + 1 + (int)(this.dataview.Columns[i - 1].Width / Rate);

189

C# winform 列印類

g.DrawLine(new Pen(Brushes.Black, 1), new Point(tempLeft, TopMargin), new Point(tempLeft, endY));

190

C# winform 列印類

}

191

C# winform 列印類

192

C# winform 列印類

}

193

C# winform 列印類
C# winform 列印類

/// <summary>

194

C# winform 列印類

/// 擷取列印的列的總寬度

195

C# winform 列印類

/// </summary>

196

C# winform 列印類

/// <returns></returns>

197

C# winform 列印類

private int GetDateViewWidth()

198

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

199

C# winform 列印類

int total = 0;

200

C# winform 列印類

for (int i = 0; i < this.columns; i++)

201

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

202

C# winform 列印類

total = total + this.dataview.Columns[i].Width;

203

C# winform 列印類

}

204

C# winform 列印類

return total;

205

C# winform 列印類

}

206

C# winform 列印類

207

C# winform 列印類

//列印行資料

208

C# winform 列印類

private void DrawRows(Graphics g)

209

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

210

C# winform 列印類

211

C# winform 列印類

Font font = new Font("宋體", 12, FontStyle.Regular);

212

C# winform 列印類

int temptop = (rowHeight / 2) + TopMargin + 1 + rowHeight;

213

C# winform 列印類

214

C# winform 列印類

215

C# winform 列印類

for (int i = currRow; i < pageSize + currRow - 1; i++)

216

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

217

C# winform 列印類

int templeft = LeftMargin + 1;

218

C# winform 列印類

for (int j = 0; j < columns; j++)

219

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

220

C# winform 列印類

string headString = this.dataview.Rows[i].Cells[j].Value.ToString();

221

C# winform 列印類

float fontHeight = g.MeasureString(headString, font).Height;

222

C# winform 列印類

float fontwidth = g.MeasureString(headString, font).Width;

223

C# winform 列印類

float temp = temptop - (fontHeight) / 3;

224

C# winform 列印類

while (true)

225

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

226

C# winform 列印類

if (fontwidth <= (int)(this.dataview.Columns[j].Width / Rate))

227

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

228

C# winform 列印類

break;

229

C# winform 列印類

}

230

C# winform 列印類

else

231

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

232

C# winform 列印類

headString = headString.Substring(0, headString.Length - 1);

233

C# winform 列印類

fontwidth = g.MeasureString(headString, font).Width;

234

C# winform 列印類

}

235

C# winform 列印類

}

236

C# winform 列印類

g.DrawString(headString, font, Brushes.Black, new PointF(templeft, temp));

237

C# winform 列印類

238

C# winform 列印類

templeft = templeft + (int)(this.dataview.Columns[j].Width / Rate) + 1;

239

C# winform 列印類

}

240

C# winform 列印類

241

C# winform 列印類

temptop = temptop + rowHeight;

242

C# winform 列印類

243

C# winform 列印類

244

C# winform 列印類

}

245

C# winform 列印類

currRow = pageSize + currRow - 1;

246

C# winform 列印類

247

C# winform 列印類

}

248

C# winform 列印類

249

C# winform 列印類
C# winform 列印類

/// <summary>

250

C# winform 列印類

/// 在PrintDocument中的PrintPage方法中調用

251

C# winform 列印類

/// </summary>

252

C# winform 列印類

/// <param name="g">傳入PrintPage中PrintPageEventArgs中的Graphics</param>

253

C# winform 列印類

/// <returns>是否還有列印頁 有傳回true,無則傳回false</returns>

254

C# winform 列印類

public bool Print(Graphics g)

255

C# winform 列印類
C# winform 列印類
C# winform 列印類

{

256

C# winform 列印類

InitPrint();

257

C# winform 列印類

DrawTable(g);

258

C# winform 列印類

DrawHeader(g);

259

C# winform 列印類

DrawRows(g);

260

C# winform 列印類

261

C# winform 列印類

//列印頁碼

262

C# winform 列印類

string pagestr = PageIndex + " / " + PageNumber;

263

C# winform 列印類

Font font = new Font("宋體", 12, FontStyle.Regular);

264

C# winform 列印類

g.DrawString(pagestr, font, Brushes.Black, new PointF((PageWidth / 2) - g.MeasureString(pagestr, font).Width, PageHeight - (BottomMargin / 2) - g.MeasureString(pagestr, font).Height));

265

C# winform 列印類

//列印查詢的功能項名稱

266

C# winform 列印類

string temp = dataview.Tag.ToString() + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm");

267

C# winform 列印類

g.DrawString(temp, font, Brushes.Black, new PointF(PageWidth - 5 - g.MeasureString(temp, font).Width, PageHeight - 5 - g.MeasureString(temp, font).Height));

268

C# winform 列印類

return hasMorePage;

269

C# winform 列印類

}

270

C# winform 列印類

271

C# winform 列印類

272

C# winform 列印類

273

C# winform 列印類

274

C# winform 列印類

275

C# winform 列印類

276

C# winform 列印類

}

277

C# winform 列印類

}

278

C# winform 列印類

繼續閱讀