private static void PrintDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { int tmpWidth, i, j; int eMarginBoundsTop = e.MarginBounds.Top; int eMarginBoundsLeft = e.MarginBounds.Left; int eMarginBoundsWidth = e.MarginBounds.Width; int tmpTop = e.MarginBounds.Top; int tmpLeft = e.MarginBounds.Left; string sTemp = ""; try { // Before starting first page, it saves Width & Height of Headers and CoulmnType if (PageNo == 1) { if (PrintXH) //有序号 { eMarginBoundsLeft += WidthXH; eMarginBoundsWidth -= WidthXH; TopXH = e.MarginBounds.Top; LeftXH = e.MarginBounds.Left; tmpLeft += WidthXH; } foreach (DataGridViewColumn GridCol in dgv.Columns) { if (!GridCol.Visible) { continue; } // Skip if the current column not selected if (!PrintDGV.SelectedColumns.Contains(GridCol.HeaderText)) { continue; } // Detemining whether the columns are fitted to page or not. if (FitToPageWidth) { tmpWidth = (int)(Math.Floor((double)((double)GridCol.Width / (double)TotalWidth * (double)TotalWidth * ((double)eMarginBoundsWidth / (double)TotalWidth)))); } else { tmpWidth = GridCol.Width; } HeaderHeight = (int)(e.Graphics.MeasureString(GridCol.HeaderText, GridCol.InheritedStyle.Font, tmpWidth).Height) + 11; // Save width & height of headres and ColumnType ColumnLefts.Add(tmpLeft); ColumnWidths.Add(tmpWidth); ColumnTypes.Add(GridCol.GetType()); tmpLeft += tmpWidth; } } // Printing Current Page, Row by Row while (RowPos <= dgv.Rows.Count - 1) { DataGridViewRow GridRow = dgv.Rows[RowPos]; if (GridRow.IsNewRow || (!PrintAllRows && !GridRow.Selected)) { RowPos++; continue; } //CellHeight = GridRow.Height; CellHeight = GridRow.Height + 8; if (tmpTop + CellHeight >= e.MarginBounds.Height + e.MarginBounds.Top) { DrawFooter(e, RowsPerPage); NewPage = true; PageNo++; e.HasMorePages = true; return; } else { if (NewPage) { // 单据汇总,表头 string[] sTitle = PrintTitle.Split(new char[1] { ';' }); for (j = 0; j < sTitle.Length; j++) { if (j <= 1) { if (j == 0) { e.Graphics.DrawString(sTitle[j], _Font12, Brushes.Black, new System.Drawing.RectangleF(e.MarginBounds.Left, tmpTop, e.MarginBounds.Width, (int)(e.Graphics.MeasureString(sTitle[j], _Font12, e.MarginBounds.Width).Height)), StrFormat); } else { e.Graphics.DrawString(sTitle[j], _Font, Brushes.Black, new System.Drawing.RectangleF(e.MarginBounds.Left, tmpTop, e.MarginBounds.Width, (int)(e.Graphics.MeasureString(sTitle[j], _Font12, e.MarginBounds.Width).Height)), StrFormatR); } } else { e.Graphics.DrawString(sTitle[j], _Font, Brushes.Black, e.MarginBounds.Left, tmpTop); } if (j == 0) { continue; } if (j == 1) { tmpTop += (int)(e.Graphics.MeasureString(sTitle[j], _Font12, e.MarginBounds.Width).Height); } else { tmpTop += (int)(e.Graphics.MeasureString(sTitle[j], _Font, e.MarginBounds.Width).Height); } } /* * e.Graphics.DrawString(PrintTitle, new System.Drawing.Font(dgv.Font, FontStyle.Bold), * Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top - * e.Graphics.MeasureString(PrintTitle, new System.Drawing.Font(dgv.Font, * FontStyle.Bold), e.MarginBounds.Width).Height - 13); * * String s = DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToShortTimeString(); * * //e.Graphics.DrawString(s, new Font(dgv.Font, FontStyle.Bold), * // Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - * // e.Graphics.MeasureString(s, new Font(dgv.Font, * // FontStyle.Bold), e.MarginBounds.Width).Width), e.MarginBounds.Top - * // e.Graphics.MeasureString(PrintTitle, new Font(new Font(dgv.Font, * // FontStyle.Bold), FontStyle.Bold), e.MarginBounds.Width).Height - 13); * * e.Graphics.DrawString(s, new System.Drawing.Font(_Font, FontStyle.Bold), * Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - * e.Graphics.MeasureString(s, new System.Drawing.Font(_Font, * FontStyle.Bold), e.MarginBounds.Width).Width), e.MarginBounds.Top - * e.Graphics.MeasureString(PrintTitle, new System.Drawing.Font(new System.Drawing.Font(_Font, * FontStyle.Bold), FontStyle.Bold), e.MarginBounds.Width).Height - 13); */ // Draw Columns //tmpTop = e.MarginBounds.Top; i = 0; //表头 if (PrintXH) //有序号 { e.Graphics.FillRectangle(new SolidBrush(Color.LightGray), new System.Drawing.Rectangle(LeftXH, tmpTop, WidthXH, HeaderHeight)); e.Graphics.DrawRectangle(Pens.Black, new System.Drawing.Rectangle(LeftXH, tmpTop, WidthXH, HeaderHeight)); e.Graphics.DrawString("序号", _Font, new SolidBrush(Color.Black), new System.Drawing.RectangleF(LeftXH, tmpTop, WidthXH, HeaderHeight), StrFormatC); } foreach (DataGridViewColumn GridCol in dgv.Columns) { if (!GridCol.Visible) { continue; } if (!PrintDGV.SelectedColumns.Contains(GridCol.HeaderText)) { continue; } e.Graphics.FillRectangle(new SolidBrush(Color.LightGray), new System.Drawing.Rectangle((int)ColumnLefts[i], tmpTop, (int)ColumnWidths[i], HeaderHeight)); e.Graphics.DrawRectangle(Pens.Black, new System.Drawing.Rectangle((int)ColumnLefts[i], tmpTop, (int)ColumnWidths[i], HeaderHeight)); e.Graphics.DrawString(GridCol.HeaderText, GridCol.InheritedStyle.Font, new SolidBrush(GridCol.InheritedStyle.ForeColor), new System.Drawing.RectangleF((int)ColumnLefts[i], tmpTop, (int)ColumnWidths[i], HeaderHeight), StrFormatC); i++; } NewPage = false; tmpTop += HeaderHeight; } // Draw Columns Contents if (PrintXH) //有序号 { e.Graphics.DrawString((RowPos + 1).ToString(), _Font, new SolidBrush(Color.Black), new RectangleF(LeftXH, (float)tmpTop, WidthXH, (float)CellHeight), StrFormatC); // Drawing Cells Borders e.Graphics.DrawRectangle(Pens.Black, new System.Drawing.Rectangle(LeftXH, tmpTop, WidthXH, CellHeight)); } i = 0; foreach (DataGridViewCell Cel in GridRow.Cells) { if (!Cel.OwningColumn.Visible) { continue; } if (!SelectedColumns.Contains(Cel.OwningColumn.HeaderText)) { continue; } // For the TextBox Column if (((Type)ColumnTypes[i]).Name == "DataGridViewTextBoxColumn" || ((Type)ColumnTypes[i]).Name == "DataGridViewLinkColumn") { if (PrintWarn) { //e.Graphics.DrawString(Cel.Value.ToString(), Cel.InheritedStyle.Font, // new SolidBrush(Cel.InheritedStyle.ForeColor), // new RectangleF((int)ColumnLefts[i], (decimal)tmpTop, // (int)ColumnWidths[i], (decimal)CellHeight), StrFormat); //确定背景 if (Cel.Style.BackColor == Color.LightPink) { e.Graphics.FillRectangle(new SolidBrush(Color.LightPink), new System.Drawing.Rectangle((int)ColumnLefts[i], (int)tmpTop, (int)ColumnWidths[i], (int)CellHeight)); } } if (Cel.Value.GetType() == typeof(System.DateTime)) { if (Cel.Value.ToString() != "") { sTemp = Convert.ToDateTime(Cel.Value.ToString()).ToString("yyyy年M月dd日"); } else { sTemp = ""; } e.Graphics.DrawString(sTemp, _Font, new SolidBrush(Cel.InheritedStyle.ForeColor), new RectangleF((int)ColumnLefts[i], (float)tmpTop, (int)ColumnWidths[i], (float)CellHeight), StrFormatC); } else { e.Graphics.DrawString(Cel.Value.ToString(), _Font, new SolidBrush(Cel.InheritedStyle.ForeColor), new RectangleF((int)ColumnLefts[i], (float)tmpTop, (int)ColumnWidths[i], (float)CellHeight), StrFormatC); } } // For the Button Column else if (((Type)ColumnTypes[i]).Name == "DataGridViewButtonColumn") { CellButton.Text = Cel.Value.ToString(); CellButton.Size = new Size((int)ColumnWidths[i], CellHeight); Bitmap bmp = new Bitmap(CellButton.Width, CellButton.Height); CellButton.DrawToBitmap(bmp, new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height)); e.Graphics.DrawImage(bmp, new System.Drawing.Point((int)ColumnLefts[i], tmpTop)); } // For the CheckBox Column else if (((Type)ColumnTypes[i]).Name == "DataGridViewCheckBoxColumn") { CellCheckBox.Size = new Size(14, 14); CellCheckBox.Checked = (bool)Cel.Value; Bitmap bmp = new Bitmap((int)ColumnWidths[i], CellHeight); Graphics tmpGraphics = Graphics.FromImage(bmp); tmpGraphics.FillRectangle(Brushes.White, new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height)); CellCheckBox.DrawToBitmap(bmp, new System.Drawing.Rectangle((int)((bmp.Width - CellCheckBox.Width) / 2), (int)((bmp.Height - CellCheckBox.Height) / 2), CellCheckBox.Width, CellCheckBox.Height)); e.Graphics.DrawImage(bmp, new System.Drawing.Point((int)ColumnLefts[i], tmpTop)); } // For the ComboBox Column else if (((Type)ColumnTypes[i]).Name == "DataGridViewComboBoxColumn") { CellComboBox.Size = new Size((int)ColumnWidths[i], CellHeight); Bitmap bmp = new Bitmap(CellComboBox.Width, CellComboBox.Height); CellComboBox.DrawToBitmap(bmp, new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height)); e.Graphics.DrawImage(bmp, new System.Drawing.Point((int)ColumnLefts[i], tmpTop)); e.Graphics.DrawString(Cel.Value.ToString(), Cel.InheritedStyle.Font, new SolidBrush(Cel.InheritedStyle.ForeColor), new RectangleF((int)ColumnLefts[i] + 1, tmpTop, (int)ColumnWidths[i] - 16, CellHeight), StrFormatComboBox); } // For the Image Column else if (((Type)ColumnTypes[i]).Name == "DataGridViewImageColumn") { System.Drawing.Rectangle CelSize = new System.Drawing.Rectangle((int)ColumnLefts[i], tmpTop, (int)ColumnWidths[i], CellHeight); Size ImgSize = ((Image)(Cel.FormattedValue)).Size; e.Graphics.DrawImage((Image)Cel.FormattedValue, new System.Drawing.Rectangle((int)ColumnLefts[i] + (int)((CelSize.Width - ImgSize.Width) / 2), tmpTop + (int)((CelSize.Height - ImgSize.Height) / 2), ((Image)(Cel.FormattedValue)).Width, ((Image)(Cel.FormattedValue)).Height)); } // Drawing Cells Borders e.Graphics.DrawRectangle(Pens.Black, new System.Drawing.Rectangle((int)ColumnLefts[i], tmpTop, (int)ColumnWidths[i], CellHeight)); i++; } tmpTop += CellHeight; } RowPos++; // For the first page it calculates Rows per Page if (PageNo == 1) { RowsPerPage++; } } if (RowsPerPage == 0) { return; } // Write Footer (Page Number) DrawFooter(e, RowsPerPage); e.HasMorePages = false; } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
/// <summary> /// 获取复选框的图像 /// </summary> /// <param name="isChecked">true为选中的样式,false为未选中的样式</param> /// <returns></returns> private Image getCheckBoxImage(bool isChecked) { if (isChecked && this.checkedCheckBoxImage != null) { return checkedCheckBoxImage; } else if (!isChecked && this.uncheckedCheckBoxImage != null) { return uncheckedCheckBoxImage; } CheckBox chk = new CheckBox(); chk.Checked = isChecked; chk.Text = ""; chk.Margin = new Padding(3, 3, 3, 3); chk.Width = 14; chk.Height = 14; chk.BackColor = Color.Transparent; Bitmap bitmap = new Bitmap(chk.Width, chk.Height); Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height); chk.DrawToBitmap(bitmap, rect); if (isChecked) { checkedCheckBoxImage = bitmap; } else { uncheckedCheckBoxImage = bitmap; } return bitmap; }