C# 打印DataTable 修正版 适应宽度超出一页 数据量超出一页的情况
2017-08-21 23:12
603 查看
转自:http://www.fx114.net/qa-42-118350.aspx本篇文章主要介绍了"C# 打印DataTable 修正版 适应宽度超出一页 数据量超出一页的情况",主要涉及到C# 打印DataTable 修正版 适应宽度超出一页 数据量超出一页的情况方面的内容,对于C# 打印DataTable 修正版适应宽度超出一页 数据量超出一页的情况感兴趣的同学可以参考一下。网上找来的代码,但是修正了一些问题,特别是在字段超过一张纸宽度时判断不正确的问题感觉导致显示错乱。调用方式如下: PrintService printService = new PrintService();if (printService.PrintDataTable(GetDataTable())MessageBox.Show("打印成功!");
using System;using System.Collections.Generic;using System.Text;using System.Drawing.Printing;using System.Windows.Forms;using System.IO;using System.Drawing;using System.Data;namespace TaiZhang.Common{ internal class PrintService { public PrintService() { } #region Members //成员 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; Int32 startColumnControls = 0; Int32 endColumnControls = 0; bool iMoreRow = false;//是否为超出的行 bool iMoreColumn = false;//是否为超出的列 #endregion #region Method for PrintDataTable //打印数据集 /// <summary> /// 打印数据集(无用) /// </summary> /// <param name="table">数据集</param> /// <returns></returns> public Boolean PrintDataTable(DataTable table, bool no) { int pageSize = 32; int count = table.Rows.Count; for (int pageIndex = 0; pageIndex < Math.Ceiling(Convert.ToDouble(count) / Convert.ToDouble(pageSize)) - 1; pageIndex++) { DataTable dt = new DataTable(); foreach (DataColumn col in table.Columns) { DataColumn colTemp = new DataColumn(); colTemp.ColumnName = col.ColumnName; colTemp.DataType = col.DataType; colTemp.DefaultValue = col.DefaultValue; dt.Columns.Add(colTemp); } for (int rowIndex = pageIndex * pageSize; rowIndex < pageIndex * pageSize + pageSize; rowIndex++) { DataRow dr = dt.NewRow(); foreach (DataColumn col in table.Columns) { dr[col.ColumnName] = table.Rows[rowIndex][col.ColumnName]; } dt.Rows.Add(dr); } //PrintDataTableSinglePage(dt); } return true; } /// <summary> /// 修正版,适应宽度超出一页 数据量超出一页的情况 /// </summary> /// <param name="table"></param> /// <returns></returns> 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 + 400; pWidth = prtDocument.PrinterSettings.DefaultPageSettings.Bounds.Right; prtDocument.PrintPage += new PrintPageEventHandler(docToPrint_PrintPage); prtDocument.Print(); } catch (InvalidPrinterException ex) { MessageBox.Show("没有安装打印机"); } catch (Exception ex) { MessageBox.Show(ex.Message); } prtDocument.Dispose(); return true; } #endregion #region Handler for docToPrint_PrintPage //设置打印机开始打印的事件处理函数 /// <summary> /// 设置打印机开始打印的事件处理函数 /// </summary> /// <param name="sender"></param> /// <param name="ev"></param> private void docToPrint_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs ev)//设置打印机开始打印的事件处理函数 { Int32 x = left; Int32 y = top; Int32 rowOfTop = top; Int32 i; Pen pen = new Pen(Brushes.Black, 1); 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; } } } if (endColumnControls != 0) { ev.Graphics.DrawString(printedTable.Columns[0].ColumnName.Trim(), prtTextFont, Brushes.Black, x, y + rowOfUpDistance); x += width[0]; } 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] > pWidth) { 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; iMoreColumn = true; } else { iMoreColumn = false; 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; if (startColumnControls != 0) { ev.Graphics.DrawString(printedTable.Rows[i][0].ToString().Trim(), prtTextFont, Brushes.Black, x, y + rowOfUpDistance); x += width[0]; } 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 > pheight - prtTextFont.Height - 450) //if (y > pWidth - prtTextFont.Height - 30) { break; } } ev.Graphics.DrawLine(pen, left, rowOfTop, left, y); x = left; if (startColumnControls != 0) { x += width[0]; ev.Graphics.DrawLine(pen, x, rowOfTop, x, y); } for (Int32 k = startColumnControls; k < endColumnControls; k++) { x += width[k]; ev.Graphics.DrawLine(pen, x, rowOfTop, x, y); } //判断高是否越界 if (y > pheight - prtTextFont.Height - 450) //if (y > pWidth - prtTextFont.Height - 30) { iMoreRow = true; } else { iMoreRow = false; } if (iMoreRow && !iMoreColumn) { startColumnControls = 0; curdgi = i + 1; endColumnControls = 0; ev.HasMorePages = true; } } #endregion }}网上找来的代码,但是修正了一些问题,特别是在字段超过一张纸宽度时判断不正确的问题感觉导致显示错乱。调用方式如下: PrintService printService = new PrintService();if (printService.PrintDataTable(GetDataTable())MessageBox.Show("打印成功!");
using System;using System.Collections.Generic;using System.Text;using System.Drawing.Printing;using System.Windows.Forms;using System.IO;using System.Drawing;using System.Data;namespace TaiZhang.Common{ internal class PrintService { public PrintService() { } #region Members //成员 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; Int32 startColumnControls = 0; Int32 endColumnControls = 0; bool iMoreRow = false;//是否为超出的行 bool iMoreColumn = false;//是否为超出的列 #endregion #region Method for PrintDataTable //打印数据集 /// <summary> /// 打印数据集(无用) /// </summary> /// <param name="table">数据集</param> /// <returns></returns> public Boolean PrintDataTable(DataTable table, bool no) { int pageSize = 32; int count = table.Rows.Count; for (int pageIndex = 0; pageIndex < Math.Ceiling(Convert.ToDouble(count) / Convert.ToDouble(pageSize)) - 1; pageIndex++) { DataTable dt = new DataTable(); foreach (DataColumn col in table.Columns) { DataColumn colTemp = new DataColumn(); colTemp.ColumnName = col.ColumnName; colTemp.DataType = col.DataType; colTemp.DefaultValue = col.DefaultValue; dt.Columns.Add(colTemp); } for (int rowIndex = pageIndex * pageSize; rowIndex < pageIndex * pageSize + pageSize; rowIndex++) { DataRow dr = dt.NewRow(); foreach (DataColumn col in table.Columns) { dr[col.ColumnName] = table.Rows[rowIndex][col.ColumnName]; } dt.Rows.Add(dr); } //PrintDataTableSinglePage(dt); } return true; } /// <summary> /// 修正版,适应宽度超出一页 数据量超出一页的情况 /// </summary> /// <param name="table"></param> /// <returns></returns> 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 + 400; pWidth = prtDocument.PrinterSettings.DefaultPageSettings.Bounds.Right; prtDocument.PrintPage += new PrintPageEventHandler(docToPrint_PrintPage); prtDocument.Print(); } catch (InvalidPrinterException ex) { MessageBox.Show("没有安装打印机"); } catch (Exception ex) { MessageBox.Show(ex.Message); } prtDocument.Dispose(); return true; } #endregion #region Handler for docToPrint_PrintPage //设置打印机开始打印的事件处理函数 /// <summary> /// 设置打印机开始打印的事件处理函数 /// </summary> /// <param name="sender"></param> /// <param name="ev"></param> private void docToPrint_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs ev)//设置打印机开始打印的事件处理函数 { Int32 x = left; Int32 y = top; Int32 rowOfTop = top; Int32 i; Pen pen = new Pen(Brushes.Black, 1); 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; } } } if (endColumnControls != 0) { ev.Graphics.DrawString(printedTable.Columns[0].ColumnName.Trim(), prtTextFont, Brushes.Black, x, y + rowOfUpDistance); x += width[0]; } 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] > pWidth) { 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; iMoreColumn = true; } else { iMoreColumn = false; 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; if (startColumnControls != 0) { ev.Graphics.DrawString(printedTable.Rows[i][0].ToString().Trim(), prtTextFont, Brushes.Black, x, y + rowOfUpDistance); x += width[0]; } 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 > pheight - prtTextFont.Height - 450) //if (y > pWidth - prtTextFont.Height - 30) { break; } } ev.Graphics.DrawLine(pen, left, rowOfTop, left, y); x = left; if (startColumnControls != 0) { x += width[0]; ev.Graphics.DrawLine(pen, x, rowOfTop, x, y); } for (Int32 k = startColumnControls; k < endColumnControls; k++) { x += width[k]; ev.Graphics.DrawLine(pen, x, rowOfTop, x, y); } //判断高是否越界 if (y > pheight - prtTextFont.Height - 450) //if (y > pWidth - prtTextFont.Height - 30) { iMoreRow = true; } else { iMoreRow = false; } if (iMoreRow && !iMoreColumn) { startColumnControls = 0; curdgi = i + 1; endColumnControls = 0; ev.HasMorePages = true; } } #endregion }}
相关文章推荐
- C# 打印DataTable 修正版 适应宽度超出一页 数据量超出一页的情况
- C#和VB: GridView的列宽如何固定住,在数据很长的情况下也不改变宽度
- 关于c#中双主键表数据如何绑定到DataTable的方法(针对于dataset.xsd的特殊情况)
- 关于c#中双主键表数据如何绑定到DataTable的方法(针对于dataset.xsd的特殊情况)
- C#实现水晶报表绑定数据并实现打印
- CSS网页布局中 DIV和TABLE超出宽度自动换行的情况分析
- C#将datatable生成easyui的绑定tree 的json数据格式
- C#打印DataGridView数据
- C#开发之DataTable多行数据的合并
- c# 多个RadioButton与DataTable的数据绑定
- C#中数据表和分析图的打印输出
- C#操作EXCEL之用OleDb快速读取数据到DataTable
- C#_把dataTable数据导出到XLS文件 ,练手
- C#从DataTable获取数据的方法
- 数据集处理成可视树,数据网格自动适应宽度
- C#利用SqlDataAdapte对DataTable进行批量数据操作
- 【C#】解决进行反序列化时出错:。InnerException 消息是“反序列化对象 属于类型 System.String 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。
- C#把DataTable数据表中的数据转换成有用信息
- C#用DataTable实现Group by数据统计
- C#调用NPOI组件读取excel表格数据转为datatable写入word表格中并向word中插入图片/文字/书签 获得书签列表