public
class
PrintFunction
...
{ public String printName = String.Empty; public Font prtTextFont = new Font( " Verdana " , 10 ); public Font prtTitleFont = new Font( " 宋体 " , 10 ); private String[] titles = new String[ 0 ]; public String[] Titles ... { set ... { titles = value as String[]; if ( null == titles) ... { titles = new String[ 0 ]; } } get ... { return titles; } } private Int32 left = 20 ; private Int32 top = 20 ; public Int32 Top ... { set ... { top = value; } get ... { return top; } } public Int32 Left ... { set ... { left = value; } get ... { return left; } } private DataTable printedTable; private Int32 pheight; private Int32 pWidth; private Int32 pindex; private Int32 curdgi; private Int32[] width; private Int32 rowOfDownDistance = 3 ; private Int32 rowOfUpDistance = 2 ; public Boolean PrintDataTable(DataTable table) ... { PrintDocument prtDocument = new PrintDocument(); try ... { if (printName != String.Empty) ... { prtDocument.PrinterSettings.PrinterName = printName; } prtDocument.DefaultPageSettings.Landscape = true ; prtDocument.OriginAtMargins = false ; PrintDialog prtDialog = new PrintDialog(); prtDialog.AllowSomePages = true ; prtDialog.ShowHelp = false ; prtDialog.Document = prtDocument; if (DialogResult.OK != prtDialog.ShowDialog()) ... { return false ; } printedTable = table; pindex = 0 ; curdgi = 0 ; width = new Int32[printedTable.Columns.Count]; pheight = prtDocument.PrinterSettings.DefaultPageSettings.Bounds.Bottom; pWidth = prtDocument.PrinterSettings.DefaultPageSettings.Bounds.Right; prtDocument.PrintPage += new PrintPageEventHandler(Document_PrintPage); prtDocument.Print(); } catch ( InvalidPrinterException ex ) ... { MessageBox.Show( " 没有安装打印机 " ); } catch (Exception ex) ... { MessageBox.Show( " 打印错误 " ); } prtDocument.Dispose(); return true ; } Int32 startColumnControls = 0 ; Int32 endColumnControls = 0 ; private void Document_PrintPage( object sender, PrintPageEventArgs ev) ... { Int32 x = left; Int32 y = top; Int32 rowOfTop = top; Int32 i; Pen pen = new Pen(Brushes.Black, 1 ); if ( 0 == pindex) ... { for (i = 0 ; i < titles.Length; i ++ ) ... { ev.Graphics.DrawString(titles[i], prtTitleFont, Brushes.Black, left, y + rowOfUpDistance); y += prtTextFont.Height + rowOfDownDistance; } rowOfTop = y; foreach (DataRow dr in printedTable.Rows) ... { for (i = 0 ; i < printedTable.Columns.Count; i ++ ) ... { Int32 colwidth = Convert.ToInt16(ev.Graphics.MeasureString(dr[i].ToString().Trim(), prtTextFont).Width); if (colwidth > width[i]) ... { width[i] = colwidth; } } } } for (i = endColumnControls; i < printedTable.Columns.Count; i ++ ) ... { String headtext = printedTable.Columns[i].ColumnName.Trim(); if (pindex == 0 ) ... { int colwidth = Convert.ToInt16(ev.Graphics.MeasureString(headtext, prtTextFont).Width); if (colwidth > width[i]) ... { width[i] = colwidth; } } if (x + width[i] > pheight) ... { break ; } ev.Graphics.DrawString(headtext, prtTextFont, Brushes.Black, x, y + rowOfUpDistance); x += width[i]; } startColumnControls = endColumnControls; if (i < printedTable.Columns.Count) ... { endColumnControls = i; ev.HasMorePages = true ; } else ... { endColumnControls = printedTable.Columns.Count; } ev.Graphics.DrawLine(pen, left, rowOfTop, x, rowOfTop); y += rowOfUpDistance + prtTextFont.Height + rowOfDownDistance; ev.Graphics.DrawLine(pen, left, y, x, y); for (i = curdgi; i < printedTable.Rows.Count; i ++ ) ... { x = left; for (Int32 j = startColumnControls; j < endColumnControls; j ++ ) ... { ev.Graphics.DrawString(printedTable.Rows[i][j].ToString().Trim(), prtTextFont, Brushes.Black, x, y + rowOfUpDistance); x += width[j]; } y += rowOfUpDistance + prtTextFont.Height + rowOfDownDistance; ev.Graphics.DrawLine(pen, left, y, x, y); if (y > pWidth - prtTextFont.Height - 30 ) ... { break ; } } ev.Graphics.DrawLine(pen, left, rowOfTop, left, y); x = left; for (Int32 k = startColumnControls; k < endColumnControls; k ++ ) ... { x += width[k]; ev.Graphics.DrawLine(pen, x, rowOfTop, x, y); } if (y > pWidth - prtTextFont.Height - 30 ) ... { pindex ++ ; if ( 0 != startColumnControls) ... { curdgi = i + 1 ; } if ( ! ev.HasMorePages) ... { endColumnControls = 0 ; } ev.HasMorePages = true ; } } public void PrintPreviewDataTable(DataTable prtTable) ... { PrintDocument prtDocument = new PrintDocument(); try ... { if (printName != String.Empty) ... { prtDocument.PrinterSettings.PrinterName = printName; } prtDocument.DefaultPageSettings.Landscape = true ; prtDocument.OriginAtMargins = false ; printedTable = prtTable; pindex = 0 ; curdgi = 0 ; width = new int [printedTable.Columns.Count]; pheight = prtDocument.PrinterSettings.DefaultPageSettings.Bounds.Bottom; pWidth = prtDocument.PrinterSettings.DefaultPageSettings.Bounds.Right; prtDocument.PrintPage += new PrintPageEventHandler(Document_PrintPage); PrintPreviewDialog prtPreviewDialog = new PrintPreviewDialog(); prtPreviewDialog.Document = prtDocument; prtPreviewDialog.ShowIcon = false ; prtPreviewDialog.WindowState = FormWindowState.Maximized; prtPreviewDialog.ShowDialog(); } catch (InvalidPrinterException ex) ... { MessageBox.Show( " 没有安装打印机 " ); } catch (Exception ex) ... { MessageBox.Show( " 打印预览失败 " ); } } }
以上代码没有对 当列的长度操作1页的情况,进行考虑。