#region 打印预览#region 变量 常量//以下用户可自定义  //当前要打印文本的字体及字号  private const int HeadHeight = 40;private static readonly Font TableFont = new Font("Verdana", 10, FontStyle.Regular);private readonly SolidBrush _drawBrush = new SolidBrush(Color.Black);//表头字体  private readonly Font _headFont = new Font("Verdana", 20, FontStyle.Bold);//表头文字  private readonly int _yUnit = TableFont.Height * 2;public int TotalNum = 0;//以下为模块内部使用  private DataRow _dataRow;private DataTable _dataTable;private int _firstPrintRecordNumber;private string _headText = string.Empty;private int _pBottom;private int _pHeigh;//当前要所要打印的记录行数,由计算得到  private int _pageLeft;private int _pRight;private int _pageTop;private int _pWidth;private int _pageRecordNumber;private PrintDocument _printDocument;private PageSetupDialog _pageSetupDialog;private int _printRecordComplete;//每页打印的记录条数  private int _printRecordNumber;private int _printingPageNumber = 1;//第一页打印的记录条数  //与列名无关的统计数据行的类目数(如,总计,小计......)  private int _totalPage;private int[] _xUnit;#endregion/// <summary>  ///     打印  /// </summary>  /// <param name="dt">要打印的DataTable</param>  /// <param name="title">打印文件的标题</param>  public void Print(DataTable dt, string title){try{CreatePrintDocument(dt, title).Print();}catch (Exception ex){MessageBox.Show("打印错误,请检查打印设置!");}}  /// <summary>  ///     打印预览  /// </summary>  /// <param name="dt">要打印的DataTable</param>  /// <param name="title">打印文件的标题</param>  public void PrintPriview(DataTable dt, string title){try{var printPriview = new PrintPreviewDialog{Document = CreatePrintDocument(dt, title),WindowState = FormWindowState.Maximized};printPriview.ShowDialog();}catch (Exception ex){MessageBox.Show("打印错误,请检查打印设置!");}}public void PrintSetting(){try{_pageSetupDialog.ShowDialog();}catch (Exception ex){MessageBox.Show("打印错误,请检查打印设置!");}}  /// <summary>  ///     创建打印文件  /// </summary>  private PrintDocument CreatePrintDocument(DataTable dt, string title){_dataTable = dt;_headText = title;var pageSetup = new PageSetupDialog();_printDocument = new PrintDocument { DefaultPageSettings = pageSetup.PageSettings };_printDocument.DefaultPageSettings.Landscape = true; //设置打印横向还是纵向  //PLeft = 30; //DataTablePrinter.DefaultPageSettings.Margins.Left;  _pageTop = _printDocument.DefaultPageSettings.Margins.Top;//PRight = DataTablePrinter.DefaultPageSettings.Margins.Right;  _pBottom = _printDocument.DefaultPageSettings.Margins.Bottom;_pWidth = _printDocument.DefaultPageSettings.Bounds.Width;_pHeigh = _printDocument.DefaultPageSettings.Bounds.Height;_xUnit = new int[_dataTable.Columns.Count];_printRecordNumber = Convert.ToInt32((_pHeigh - _pageTop - _pBottom - _yUnit) / _yUnit);_firstPrintRecordNumber = Convert.ToInt32((_pHeigh - _pageTop - _pBottom - HeadHeight - _yUnit) / _yUnit);if (_dataTable.Rows.Count > _printRecordNumber){if ((_dataTable.Rows.Count - _firstPrintRecordNumber) % _printRecordNumber == 0){_totalPage = (_dataTable.Rows.Count - _firstPrintRecordNumber) / _printRecordNumber + 1;}else{_totalPage = (_dataTable.Rows.Count - _firstPrintRecordNumber) / _printRecordNumber + 2;}}else{_totalPage = 1;}_printDocument.PrintPage += PrintDocumentPrintPage;_printDocument.DocumentName = _headText;return _printDocument;}  /// <summary>  ///     打印当前页  /// </summary>  private void PrintDocumentPrintPage(object sende, PrintPageEventArgs @event)  {  int tableWith = 0;  string columnText;  var font = new StringFormat { Alignment = StringAlignment.Center };  var pen = new Pen(Brushes.Black, 1);//打印表格线格式  #region 设置列宽  foreach (DataRow dr in _dataTable.Rows)  {  for (int i = 0; i < _dataTable.Columns.Count; i++)  {  int colwidth = Convert.ToInt32(@event.Graphics.MeasureString(dr[i].ToString().Trim(), TableFont).Width);  if (colwidth > _xUnit[i])  {  _xUnit[i] = colwidth;  }  }  }  if (_printingPageNumber == 1)  {  for (int cols = 0; cols <= _dataTable.Columns.Count - 1; cols++)  {  columnText = _dataTable.Columns[cols].ColumnName.Trim();  int colwidth = Convert.ToInt32(@event.Graphics.MeasureString(columnText, TableFont).Width);  if (colwidth > _xUnit[cols])  {  _xUnit[cols] = colwidth;  }  }  }  for (int i = 0; i < _xUnit.Length; i++)  {  tableWith += _xUnit[i];  }  #endregion  _pageLeft = (@event.PageBounds.Width - tableWith) / 2;  int x = _pageLeft;  int y = _pageTop;  int stringY = _pageTop + (_yUnit - TableFont.Height) / 2;  int rowOfTop = _pageTop;  //第一页  if (_printingPageNumber == 1)  {  //打印表头  var arr = _headText.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries);  if (arr.Length > 1)  {  @event.Graphics.DrawString(arr[0],  _headFont,  _drawBrush,  new Point(@event.PageBounds.Width / 2, _pageTop), font);  }  //副标题  var subtitleHeight = 0;  for (int i = 1; i < arr.Length; i++)  {  @event.Graphics.DrawString(arr[i],  new Font("Verdana", 12, FontStyle.Regular),  _drawBrush,  new Point(@event.PageBounds.Width / 2, _pageTop + _headFont.Height),  font);  subtitleHeight += new Font("Verdana", 12, FontStyle.Regular).Height;  }  //设置为第一页时行数   if (_dataTable.Rows.Count < _firstPrintRecordNumber)  {  _pageRecordNumber = _dataTable.Rows.Count;  }  else  {  _pageRecordNumber = _firstPrintRecordNumber;  }  rowOfTop = y = (_pageTop + _headFont.Height + subtitleHeight + 10);  stringY = _pageTop + _headFont.Height + subtitleHeight + 10 + (_yUnit - TableFont.Height) / 2;  }  else  {  //计算,余下的记录条数是否还可以在一页打印,不满一页时为假  if (_dataTable.Rows.Count - _printRecordComplete >= _printRecordNumber)  {  _pageRecordNumber = _printRecordNumber;  }  else  {  _pageRecordNumber = _dataTable.Rows.Count - _printRecordComplete;  }  }  #region 列名  if (_printingPageNumber == 1 || _pageRecordNumber > TotalNum) //最后一页只打印统计行时不打印列名  {  //得到datatable的所有列名  for (int cols = 0; cols <= _dataTable.Columns.Count - 1; cols++)  {  columnText = _dataTable.Columns[cols].ColumnName.Trim();  int colwidth = Convert.ToInt32(@event.Graphics.MeasureString(columnText, TableFont).Width);  @event.Graphics.DrawString(columnText, TableFont, _drawBrush, x, stringY);  x += _xUnit[cols];  }  }  #endregion  @event.Graphics.DrawLine(pen, _pageLeft, rowOfTop, x, rowOfTop);  stringY += _yUnit;  y += _yUnit;  @event.Graphics.DrawLine(pen, _pageLeft, y, x, y);  //当前页面已经打印的记录行数  int printingLine = 0;  while (printingLine < _pageRecordNumber)  {  x = _pageLeft;  //确定要当前要打印的记录的行号  _dataRow = _dataTable.Rows[_printRecordComplete];  for (int cols = 0; cols <= _dataTable.Columns.Count - 1; cols++)  {  @event.Graphics.DrawString(_dataRow[cols].ToString().Trim(), TableFont, _drawBrush, x, stringY);  x += _xUnit[cols];  }  stringY += _yUnit;  y += _yUnit;  @event.Graphics.DrawLine(pen, _pageLeft, y, x, y);  printingLine += 1;  _printRecordComplete += 1;  if (_printRecordComplete >= _dataTable.Rows.Count)  {  @event.HasMorePages = false;  _printRecordComplete = 0;  }  }  @event.Graphics.DrawLine(pen, _pageLeft, rowOfTop, _pageLeft, y);  x = _pageLeft;  for (int cols = 0; cols < _dataTable.Columns.Count; cols++)  {  x += _xUnit[cols];  @event.Graphics.DrawLine(pen, x, rowOfTop, x, y);  }  _printingPageNumber += 1;  if (_printingPageNumber > _totalPage)  {  @event.HasMorePages = false;  _printingPageNumber = 1;  _printRecordComplete = 0;  }  else  {  @event.HasMorePages = true;  }  }  #endregionprivate void button1_Click(object sender, EventArgs e){PrintPriview(table, "Student");}

调用方法:

打印:new PrintHelper().Print(dataTable,title);

预览:new PrintHelper().PrintPriview(dataTable,title);

转载:http://blog.csdn.net/a497785609/article/details/71190960

C# 打印预览 PrintDocument打印、打印预览相关推荐

  1. C# 使用自带的组件PrintPreviewDialog 和 PrintDocument实现打印预览(一)

    文章目录 前言 相关内容了解 打印预览功能 1 创建winform工程 2 创建要打印的测试数据 3 绘制打印页 绘制页脚 绘制内容 PrintPage事件 完整的代码工程 小节 前言 有这么个需求: ...

  2. c#endread怎么打印出来_C#教程之打印和打印预览

    最近研究一了一下关于PDF打印和打印预览的功能,在此小小的总结记录一下学习过程. 实现打印和打印预览的方法,一般要实现如下的菜单项:打印.打印预览.页面设置. PrintDocument类 Print ...

  3. php 浏览器 打印控件,JavaScript_JavaScript 实现打印,打印预览,打印设置,WebBrowser是IE内置的浏览器控件 - phpStudy...

    JavaScript 实现打印,打印预览,打印设置 WebBrowser是IE内置的浏览器控件,无需用户下载. 一.WebBrowser控件 二.WebBrowder控件的方法 //打印 WebBro ...

  4. 打印出来只有a4纸一半 预览是正常的_还需要去打印店?能随身使用的便携打印机:汉印MT800评测...

    打印机是我们日常生活中比较常用的一款硬件设备,在一些办公室.会议室等场景都能看到Ta的存在,而用户群体也都是办公人士居多,像打印文件.合同都需要通过打印机来完成.但对于一些家庭用户来说,想要打印一些文 ...

  5. 谷歌浏览器打印不弹出预览直接打印机打印

    谷歌浏览器打印不弹出预览直接打印机打印 注意 --kiosk-printing前面有个空格 这个浏览器还是会弹出自带打印页,不过会马上消失的

  6. 【iframe结合pdf.js实现pdf的预览/下载及打印功能】

    iframe结合pdf.js实现pdf的预览/下载及打印 1.[下载pdf.js](http://mozilla.github.io/pdf.js/getting_started/#download) ...

  7. web页面调用打印机不预览直接执行打印

    web页面调用打印机不预览直接执行打印 <%@ page language="java" import="java.util.*" contentType ...

  8. java web pdf 打印预览_java原装代码完成pdf在线预览和pdf打印及下载

    前提准备: 1. 项目中至少需要引入的jar包,注意版本: a) core-renderer.jar b) freemarker-2.3.16.jar c) iText-2.0.8.jar d) iT ...

  9. 自定义模板、自定义打印机、自动打印:grid++ report自动打印、clodop预览和自动打印(electron+vue)

    一.grid++ report选择模板预览和自动打印 这里主要是前后端配合,数据前端传入,打印后端配置. IGridppReport 成员: 封装立即打印,数据格式为: {"reportDa ...

最新文章

  1. Dictionary作为数据源绑定,调用c++库中返回为BYTE*的函数,listView项排序
  2. [转]DB2常用命令大全
  3. 恩施软件开发人员每月多少钱_恩施建个大棚多少钱搭建、养猪大棚价格
  4. 一个简单好用的java增量更新工具
  5. c语言作业答案N个公约数公倍数,c语言程序题,输入两个正整数m和n,求其最大公约数和最小公倍数。...
  6. 《Leetcode》目录
  7. 4. PHP递增/递减运算符
  8. Python编程常见出错信息及原因分析(5):安装扩展库
  9. 推荐几个我目前在用的简历制作工具
  10. 解决 ModuleNotFoundError: No module named ‘requests‘ 问题
  11. 利用集成学习(Adaboost(DTs))对高光谱影像数据集(mat)分类
  12. 微信公众号之测试号管理
  13. Vue中的视频播放插件( vue-video-player )
  14. Lua环境搭建 Win10
  15. CodeVS3498 小木棍
  16. 计算机的变化作文,我的变化作文
  17. Dialer中界面组成、Call对象和log分析
  18. 阅读作业第一弹——移山之道 by 吴煜
  19. 电力电子技术:电力电子器件
  20. python 遍历函数用法_python中enumerate函数遍历元素用法分析

热门文章

  1. BBEdit 12.6.3 FIXED 特别版 Mac 强大的文本和HTML编辑器及汉化工具
  2. 《Android之大话设计模式》--设计原则 第三章:开放封闭原则 孙悟空任弼马温一职
  3. CSS-基础选择器、字体文本属性、引入方式
  4. 如何使用搜索技巧来成为一名高效的程序员(很好的总结)
  5. 交出2021年进步答卷,挚文集团如何做到稳中求进?
  6. python爬虫获取电影天堂中电影的标题与下载地址,并用正则表达匹配电影类型
  7. 2021-2027全球与中国牛肉罐头市场现状及未来发展趋势
  8. 电子显示Display基础知识
  9. excel行列互换_小白学Excel怎么做?|苦苦整理四小时!
  10. QII中的几个Warning的解决方法