打印不超过一页的显示正常,超过一页下面的汇总和明细之间就会有一段空格,这是什么原因呢,各位大神,急用,在线等
4条回答 默认 最新
- netlocks 2018-04-04 04:31关注
PrintService printService = new PrintService();
if (printService.PrintDataTable(GetDataTable())
MessageBox.Show(“打印成功!” );
[csharp] 查看纯文本
使用 系统;
使用 System.Collections.Generic;
使用 System.Text;
使用 System.Drawing.Printing;
使用 System.Windows.Forms;
使用 System.IO;
使用 System.Drawing;
使用 System.Data;命名空间 TaiZhang.Common
{
内部类 PrintService
{
public PrintService()
{} #region会员//成员 public String printName = String.Empty; public Font prtTextFont = new Font(“Verdana” ,10); public Font prtTitleFont = new Font(“宋体” ,10); private String [] titles = new String [0]; 公共 字符串[]标题 { 组 { titles = value as String []; if (null == titles) { titles = new String [0]; } } 得到 { 返回 标题; } } 私人 Int32左= 20; private Int32 top = 20; public Int32 Top { set {top = value; } get { return top; }} public Int32 Left { set {left = value; } get { return left; }} 私人 DataTable打印表; 私人 Int32高度; 私人 Int32 pWidth; 私人 Int32 pindex; 私人 Int32 curdgi; 私人 Int32 []宽度; 私人 Int32 rowOfDownDistance = 3; 私人 Int32 rowOfUpDistance = 2; Int32 startColumnControls = 0; Int32 endColumnControls = 0; 布尔型 iMoreRow = false ; //是否为超出的行 布尔型 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); } 返回true ; } /// <summary> ///修正版,适应宽度超出一页数据量超出一页的情况 /// </ summary> /// <param name =“table”> </ param> /// <returns> </ returns> 公共 布尔值PrintDataTable(DataTable表) { PrintDocument prtDocument = new PrintDocument(); 尝试 { 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()) { 返回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 + = 新的 PrintPageEventHandler(docToPrint_PrintPage); prtDocument.Print(); } catch (InvalidPrinterException ex) { MessageBox.Show(“没有安装打印机” ); } catch (Exception ex) { MessageBox.Show(ex.Message); } prtDocument.Dispose(); 返回true ; } #endregion #region Handler for docToPrint_PrintPage //设置打印机开始打印的事件处理函数 /// <summary> ///设置打印机开始打印的事件处理函数 /// </ summary> /// <param name =“sender”> </ param> /// <param name =“ev”> </ param> 私人无效 docToPrint_PrintPage(对象 发件人, 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 在 printedTable.Rows) { for (i = 0; i <printedTable.Columns.Count; i ++) { Int32 colwidth = Convert.ToInt16(ev.Graphics.MeasureString(dr [i] .ToString()。Trim(),prtTextFont).Width); 如果 (colwidth> width [i]) { 宽度[i] = colwidth; } } } 如果 (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(); 如果 (pindex == 0) { int colwidth = Convert.ToInt16(ev.Graphics.MeasureString(headtext,prtTextFont).Width); 如果 (colwidth> width [i]) { 宽度[i] = colwidth; } } //判断宽是否越界 if (x + width [i]> pWidth) { 休息; } ev.Graphics.DrawString(headtext,prtTextFont,Brushes.Black,x,y + rowOfUpDistance); x + = width [i]; } startColumnControls = endColumnControls; 如果 (我<printedTable.Columns.Count) { endColumnControls = i; ev.HasMorePages = true ; iMoreColumn = true ; } 其他 { 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 =左边; 如果 (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) { 休息; } } ev.Graphics.DrawLine(pen,left,rowOfTop,left,y); x =左边; 如果 (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 ; } 其他 { iMoreRow = false ; } if (iMoreRow &&!iMoreColumn) { startColumnControls = 0; curdgi = i + 1; endColumnControls = 0; ev.HasMorePages = true ; } } #endregion }
}
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 Python爬取指定微博话题下的内容,保存为txt
- ¥15 vue2登录调用后端接口如何实现
- ¥65 永磁型步进电机PID算法
- ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
- ¥88 找成都本地经验丰富懂小程序开发的技术大咖
- ¥15 如何处理复杂数据表格的除法运算
- ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
- ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
- ¥15 latex怎么处理论文引理引用参考文献
- ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?