如何从DataGridView控件中打印值

我有一个具有DataGridView控件的应用程序,该DataGridView在按下“print”按钮时保存我想要打印的数据。

到目前为止,我已经有了“打印”按钮,但是当我在应用程序上打印时,页面出现空白!

如何编辑代码以启用数据打印?

 public partial class frmViewBookings : Form { private void btnClose_Click(object sender, EventArgs e) { Form3 mainpage = new Form3(); mainpage.Show(); this.Close(); } private void frmViewBookings_Load(object sender, EventArgs e) { this.bookingTableAdapter.Fill(this.usersDataSet1.Booking); } private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { var myPaintArgs = new PaintEventArgs ( e.Graphics, new Rectangle(new Point(0, 0), this.Size) ); this.InvokePaint(dataGridView1, myPaintArgs); } private void btnPrint_Click(object sender, EventArgs e) { printDocument1.Print(); } } 

我以前测试此类用于打印data grid view内容

将此类添加到项目中:

  class ClsPrint { #region Variables int iCellHeight = 0; //Used to get/set the datagridview cell height int iTotalWidth = 0; // int iRow = 0;//Used as counter bool bFirstPage = false; //Used to check whether we are printing first page bool bNewPage = false;// Used to check whether we are printing a new page int iHeaderHeight = 0; //Used for the header height StringFormat strFormat; //Used to format the grid rows. ArrayList arrColumnLefts = new ArrayList();//Used to save left coordinates of columns ArrayList arrColumnWidths = new ArrayList();//Used to save column widths private PrintDocument _printDocument = new PrintDocument(); private DataGridView gw = new DataGridView(); private string _ReportHeader; #endregion public ClsPrint(DataGridView gridview, string ReportHeader) { _printDocument.PrintPage += new PrintPageEventHandler(_printDocument_PrintPage); _printDocument.BeginPrint += new PrintEventHandler(_printDocument_BeginPrint); gw = gridview; _ReportHeader = ReportHeader; } public void PrintForm() { ////Open the print dialog //PrintDialog printDialog = new PrintDialog(); //printDialog.Document = _printDocument; //printDialog.UseEXDialog = true; ////Get the document //if (DialogResult.OK == printDialog.ShowDialog()) //{ // _printDocument.DocumentName = "Test Page Print"; // _printDocument.Print(); //} //Open the print preview dialog PrintPreviewDialog objPPdialog = new PrintPreviewDialog(); objPPdialog.Document = _printDocument; objPPdialog.ShowDialog(); } private void _printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { //try //{ //Set the left margin int iLeftMargin = e.MarginBounds.Left; //Set the top margin int iTopMargin = e.MarginBounds.Top; //Whether more pages have to print or not bool bMorePagesToPrint = false; int iTmpWidth = 0; //For the first page to print set the cell width and header height if (bFirstPage) { foreach (DataGridViewColumn GridCol in gw.Columns) { iTmpWidth = (int)(Math.Floor((double)((double)GridCol.Width / (double)iTotalWidth * (double)iTotalWidth * ((double)e.MarginBounds.Width / (double)iTotalWidth)))); iHeaderHeight = (int)(e.Graphics.MeasureString(GridCol.HeaderText, GridCol.InheritedStyle.Font, iTmpWidth).Height) + 11; // Save width and height of headers arrColumnLefts.Add(iLeftMargin); arrColumnWidths.Add(iTmpWidth); iLeftMargin += iTmpWidth; } } //Loop till all the grid rows not get printed while (iRow <= gw.Rows.Count - 1) { DataGridViewRow GridRow = gw.Rows[iRow]; //Set the cell height iCellHeight = GridRow.Height + 5; int iCount = 0; //Check whether the current page settings allows more rows to print if (iTopMargin + iCellHeight >= e.MarginBounds.Height + e.MarginBounds.Top) { bNewPage = true; bFirstPage = false; bMorePagesToPrint = true; break; } else { if (bNewPage) { //Draw Header e.Graphics.DrawString(_ReportHeader, new Font(gw.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top - e.Graphics.MeasureString(_ReportHeader, new Font(gw.Font, FontStyle.Bold), e.MarginBounds.Width).Height - 13); String strDate = ""; //Draw Date e.Graphics.DrawString(strDate, new Font(gw.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - e.Graphics.MeasureString(strDate, new Font(gw.Font, FontStyle.Bold), e.MarginBounds.Width).Width), e.MarginBounds.Top - e.Graphics.MeasureString(_ReportHeader, new Font(new Font(gw.Font, FontStyle.Bold), FontStyle.Bold), e.MarginBounds.Width).Height - 13); //Draw Columns iTopMargin = e.MarginBounds.Top; DataGridViewColumn[] _GridCol = new DataGridViewColumn[gw.Columns.Count]; int colcount = 0; //Convert ltr to rtl foreach (DataGridViewColumn GridCol in gw.Columns) { _GridCol[colcount++] = GridCol; } for (int i = (_GridCol.Count() - 1); i >= 0; i--) { e.Graphics.FillRectangle(new SolidBrush(Color.LightGray), new Rectangle((int)arrColumnLefts[iCount], iTopMargin, (int)arrColumnWidths[iCount], iHeaderHeight)); e.Graphics.DrawRectangle(Pens.Black, new Rectangle((int)arrColumnLefts[iCount], iTopMargin, (int)arrColumnWidths[iCount], iHeaderHeight)); e.Graphics.DrawString(_GridCol[i].HeaderText, _GridCol[i].InheritedStyle.Font, new SolidBrush(_GridCol[i].InheritedStyle.ForeColor), new RectangleF((int)arrColumnLefts[iCount], iTopMargin, (int)arrColumnWidths[iCount], iHeaderHeight), strFormat); iCount++; } bNewPage = false; iTopMargin += iHeaderHeight; } iCount = 0; DataGridViewCell[] _GridCell = new DataGridViewCell[GridRow.Cells.Count]; int cellcount = 0; //Convert ltr to rtl foreach (DataGridViewCell Cel in GridRow.Cells) { _GridCell[cellcount++] = Cel; } //Draw Columns Contents for (int i = (_GridCell.Count() - 1); i >= 0; i--) { if (_GridCell[i].Value != null) { e.Graphics.DrawString(_GridCell[i].FormattedValue.ToString(), _GridCell[i].InheritedStyle.Font, new SolidBrush(_GridCell[i].InheritedStyle.ForeColor), new RectangleF((int)arrColumnLefts[iCount], (float)iTopMargin, (int)arrColumnWidths[iCount], (float)iCellHeight), strFormat); } //Drawing Cells Borders e.Graphics.DrawRectangle(Pens.Black, new Rectangle((int)arrColumnLefts[iCount], iTopMargin, (int)arrColumnWidths[iCount], iCellHeight)); iCount++; } } iRow++; iTopMargin += iCellHeight; } //If more lines exist, print another page. if (bMorePagesToPrint) e.HasMorePages = true; else e.HasMorePages = false; //} //catch (Exception exc) //{ // MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, // MessageBoxIcon.Error); //} } private void _printDocument_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e) { try { strFormat = new StringFormat(); strFormat.Alignment = StringAlignment.Center; strFormat.LineAlignment = StringAlignment.Center; strFormat.Trimming = StringTrimming.EllipsisCharacter; arrColumnLefts.Clear(); arrColumnWidths.Clear(); iCellHeight = 0; iRow = 0; bFirstPage = true; bNewPage = true; // Calculating Total Widths iTotalWidth = 0; foreach (DataGridViewColumn dgvGridCol in gw.Columns) { iTotalWidth += dgvGridCol.Width; } } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } 

使用:这将显示带有网格视图结果的打印对话框

 ClsPrint _ClsPrint = new ClsPrint(dataGridView1, "header doc text"); _ClsPrint.PrintForm(); 

结果

在此处输入图像描述

更多信息和完整的示例项目

使用IRSOG代码时,请将转换ltr下面的循环方向更改为rtl以获得常规结果。 否则整个dgv将被翻转。

  1. 打开Visual Studio 2010。
  2. 创建新项目并给出适当的名称。
  3. 从工具箱中拖放表单中的datagridview。
  4. 在datagridview中添加数据。
  5. 从工具箱中拖放printDocument。
  6. 在表单上添加一个打印按钮。
  7. 双击以获取按钮的单击事件。
  8. 在打印按钮单击事件中写下以下代码。 printDocument1.Print();
  9. 双击printDocument以获取Print Page事件。
  10. 编写以下代码以打印datagridview: –

     private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { Bitmap bm = new Bitmap(this.dataGridView1.Width, this.dataGridView1.Height); dataGridView1.DrawToBitmap(bm, new Rectangle(0, 0, this.dataGridView1.Width, this.dataGridView1.Height)); e.Graphics.DrawImage(bm, 0, 0); } 

来源https://www.mindstick.com/Articles/1356/datagridview-printing-in-c-sharp

这将完全奏效