来源:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.Drawing.Printing; using System.Windows.Forms; /// <summary> /// <para> 打印DataGridView </para> /// <para> 用法: </para> /// <para> DataGridViewPrint dgvPrint = new DataGridViewPrint(new DataGridView[] { DataGridView1,DataGridView2 }); </para> /// <para> dgvPrint.Print(); </para> /// </summary> public class DataGridViewPrint{ private DataGridView[] dataGridView; private PrintDocument printDocument; private PageSetupDialog pageSetupDialog; private PrintPreviewDialog printPreviewDialog; private int dgvIndex = 0 ; private int rowCount = 0 ; private int colCount = 0 ; private int x = 0 ; private int y = 0 ; int i = 0 ; private int rowGap = 60 ; private int leftMargin = 50 ; private Font font = new Font( " Arial " , 10 ); private Font headingFont = new Font( " Arial " , 11 , FontStyle.Underline); private Font captionFont = new Font( " Arial " , 10 , FontStyle.Bold); private Brush brush = new SolidBrush(Color.Black); private string cellValue = string .Empty; public DataGridViewPrint(DataGridView[] dataGridView) { this .dataGridView = dataGridView; printDocument = new PrintDocument(); printDocument.PrintPage += new PrintPageEventHandler( this .printDocument_PrintPage); } private void printDocument_PrintPage( object sender, System.Drawing.Printing.PrintPageEventArgs e) { for (; dgvIndex < dataGridView.Length; dgvIndex ++ ) { rowCount = dataGridView[dgvIndex].Rows.Count - 1 ; colCount = dataGridView[dgvIndex].ColumnCount; // print headings y += rowGap; x = leftMargin; for ( int j = 0 ; j < colCount; j ++ ) { if (dataGridView[dgvIndex].Columns[j].Width > 0 ) { cellValue = dataGridView[dgvIndex].Columns[j].HeaderText; e.Graphics.FillRectangle( new SolidBrush(Color.LightGray), x, y, dataGridView[dgvIndex].Columns[j].Width, rowGap); e.Graphics.DrawRectangle(Pens.Black, x, y, dataGridView[dgvIndex].Columns[j].Width, rowGap); e.Graphics.DrawString(cellValue, headingFont, brush, x, y); x += dataGridView[dgvIndex].Columns[j].Width; } } // print all rows for (; i < rowCount; i ++ ) { y += rowGap; x = leftMargin; for ( int j = 0 ; j < colCount; j ++ ) { if (dataGridView[dgvIndex].Columns[j].Width > 0 ) { cellValue = dataGridView[dgvIndex].Rows[i].Cells[j].Value.ToString(); e.Graphics.DrawRectangle(Pens.Black, x, y, dataGridView[dgvIndex].Columns[j].Width, rowGap); e.Graphics.DrawString(cellValue, font, brush, x, y); x += dataGridView[dgvIndex].Columns[j].Width; } } if (y >= e.PageBounds.Height - 80 ) { // 允許多頁打印 y = 0 ; e.HasMorePages = true ; i ++ ; return ; } } y += rowGap; for ( int j = 0 ; j < colCount; j ++ ) { e.Graphics.DrawString( " " , font, brush, x, y); } i = 0 ; } e.HasMorePages = false ; } public PrintDocument GetPrintDocument() { return printDocument; } public void Print() { try { pageSetupDialog = new PageSetupDialog(); pageSetupDialog.Document = printDocument; pageSetupDialog.ShowDialog(); printPreviewDialog = new PrintPreviewDialog(); printPreviewDialog.Document = printDocument; printPreviewDialog.Height = 600 ; printPreviewDialog.Width = 800 ; printPreviewDialog.ShowDialog(); } catch (Exception e) { throw new Exception( " Printer error. " + e.Message); } }}