1 using System; 2 using System.Data; 3 using System.Drawing; 4 using System.Drawing.Printing; 5 using System.Windows.Forms; 6 7 8 namespace InvoiceSystem{ 9 10 public partial class Printer : Form 11 { 12 private DataGridView invoiceGrid; 13 private int rowCount = 0; //datagridview行数 14 private int colCount = 0; //datagridview列数 15 private int x = 0; //一个datagridview单元格宽度 16 private int y = 0; //当前行行间距 17 int i = 0; //判断行数for循环的起始值 18 private int rowGap = 60; //行间距 19 private int leftMargin = 50; //正文到左面的左边距 20 private Font font = new Font("Arial", 10); //正文字体 21 private Font headingFont = new Font("Arial", 11, FontStyle.Underline); //标题字体 22 private Font captionFont = new Font("Arial", 10, FontStyle.Bold); 23 private Brush brush = new SolidBrush(Color.Black); 24 private string cellValue = string.Empty; //保存datagridview一个单元格里的内容 25 26 27 public Printer(DataGridView invoiceGrid) 28 { 29 InitializeComponent(); 30 this.invoiceGrid = invoiceGrid; //从外部传入一个datagridview引用 31 32 } 33 34 35 ///36 /// 打印按钮 37 /// 38 /// 39 /// 40 private void button1_Click(object sender, EventArgs e) 41 { 42 43 printDocument1.DocumentName = "发票列表"; //打印的文档文件名 44 PaperSize ps=new PaperSize("16开",724,1024); //自定义纸张大小 45 //ps.RawKind = 9; //设置为A4 46 printDocument1.DefaultPageSettings.PaperSize = ps; 47 printDocument1.DefaultPageSettings.Landscape = true; //使用横向打印 48 49 printDocument1.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage); //设置函数printDocument1_PrintPage为打印事件处理函数 50 printDialog1.Document = printDocument1; 51 printPreviewDialog1.Document = printDocument1; 52 53 if (printDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK && printPreviewDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) 54 { 55 56 printDocument1.Print(); 57 58 59 } 60 } 61 62 63 private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 64 { 65 66 rowCount = invoiceGrid.Rows.Count - 1; 67 colCount = invoiceGrid.ColumnCount; 68 69 //打印标题 70 y += rowGap; 71 x = leftMargin; 72 for (int j = 0; j < colCount; j++) 73 { 74 if (invoiceGrid.Columns[j].Width>0) 75 { 76 cellValue = invoiceGrid.Columns[j].HeaderText; 77 e.Graphics.FillRectangle(new SolidBrush(Color.LightGray), x, y, invoiceGrid.Columns[j].Width, rowGap); //将单元格的背景设置为灰色 78 e.Graphics.DrawRectangle(Pens.Black, x, y, invoiceGrid.Columns[j].Width, rowGap); //画出一个单元格 79 e.Graphics.DrawString(cellValue, headingFont, brush, x, y); //将datagridview标题里的单元格里的内容填入刚才画出的单元格 80 x += invoiceGrid.Columns[j].Width; //宽度向后移一个datagridview单元格宽度的单位 81 } 82 } 83 84 //打印所有行 85 for (; i < rowCount; i++) 86 { 87 y += rowGap; 88 x = leftMargin; 89 90 for (int j = 0; j < colCount; j++) 91 { 92 if (invoiceGrid.Columns[j].Width>0) 93 { 94 cellValue = invoiceGrid.Rows[i].Cells[j].Value.ToString(); 95 e.Graphics.DrawRectangle(Pens.Black, x, y, invoiceGrid.Columns[j].Width, rowGap); 96 e.Graphics.DrawString(cellValue, font, brush, x, y); 97 x += invoiceGrid.Columns[j].Width; 98 } 99 } 100 101 if (y > e.PageBounds.Height) //e.PageBounds.Height表示页边距的高度 102 { 103 //允许多页打印 104 y = 0; 105 e.HasMorePages = true; //如果还有没有打印的就再执行一次print()函数把余下的打印出来 106 i++; 107 return; 108 109 } 110 111 } 112 y += rowGap; 113 114 115 //底部填充空格 116 for (int j = 0; j < colCount; j++) 117 { 118 e.Graphics.DrawString(" ", font, brush, x, y); 119 } 120 i = 0; 121 e.HasMorePages = false; 122 } 123 } 124 }
效果就是贴出的图片的样子