C# 打印预览 PrintDocument打印、打印预览
#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打印、打印预览相关推荐
- C# 使用自带的组件PrintPreviewDialog 和 PrintDocument实现打印预览(一)
文章目录 前言 相关内容了解 打印预览功能 1 创建winform工程 2 创建要打印的测试数据 3 绘制打印页 绘制页脚 绘制内容 PrintPage事件 完整的代码工程 小节 前言 有这么个需求: ...
- c#endread怎么打印出来_C#教程之打印和打印预览
最近研究一了一下关于PDF打印和打印预览的功能,在此小小的总结记录一下学习过程. 实现打印和打印预览的方法,一般要实现如下的菜单项:打印.打印预览.页面设置. PrintDocument类 Print ...
- php 浏览器 打印控件,JavaScript_JavaScript 实现打印,打印预览,打印设置,WebBrowser是IE内置的浏览器控件 - phpStudy...
JavaScript 实现打印,打印预览,打印设置 WebBrowser是IE内置的浏览器控件,无需用户下载. 一.WebBrowser控件 二.WebBrowder控件的方法 //打印 WebBro ...
- 打印出来只有a4纸一半 预览是正常的_还需要去打印店?能随身使用的便携打印机:汉印MT800评测...
打印机是我们日常生活中比较常用的一款硬件设备,在一些办公室.会议室等场景都能看到Ta的存在,而用户群体也都是办公人士居多,像打印文件.合同都需要通过打印机来完成.但对于一些家庭用户来说,想要打印一些文 ...
- 谷歌浏览器打印不弹出预览直接打印机打印
谷歌浏览器打印不弹出预览直接打印机打印 注意 --kiosk-printing前面有个空格 这个浏览器还是会弹出自带打印页,不过会马上消失的
- 【iframe结合pdf.js实现pdf的预览/下载及打印功能】
iframe结合pdf.js实现pdf的预览/下载及打印 1.[下载pdf.js](http://mozilla.github.io/pdf.js/getting_started/#download) ...
- web页面调用打印机不预览直接执行打印
web页面调用打印机不预览直接执行打印 <%@ page language="java" import="java.util.*" contentType ...
- 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 ...
- 自定义模板、自定义打印机、自动打印:grid++ report自动打印、clodop预览和自动打印(electron+vue)
一.grid++ report选择模板预览和自动打印 这里主要是前后端配合,数据前端传入,打印后端配置. IGridppReport 成员: 封装立即打印,数据格式为: {"reportDa ...
最新文章
- Dictionary作为数据源绑定,调用c++库中返回为BYTE*的函数,listView项排序
- [转]DB2常用命令大全
- 恩施软件开发人员每月多少钱_恩施建个大棚多少钱搭建、养猪大棚价格
- 一个简单好用的java增量更新工具
- c语言作业答案N个公约数公倍数,c语言程序题,输入两个正整数m和n,求其最大公约数和最小公倍数。...
- 《Leetcode》目录
- 4. PHP递增/递减运算符
- Python编程常见出错信息及原因分析(5):安装扩展库
- 推荐几个我目前在用的简历制作工具
- 解决 ModuleNotFoundError: No module named ‘requests‘ 问题
- 利用集成学习(Adaboost(DTs))对高光谱影像数据集(mat)分类
- 微信公众号之测试号管理
- Vue中的视频播放插件( vue-video-player )
- Lua环境搭建 Win10
- CodeVS3498 小木棍
- 计算机的变化作文,我的变化作文
- Dialer中界面组成、Call对象和log分析
- 阅读作业第一弹——移山之道 by 吴煜
- 电力电子技术:电力电子器件
- python 遍历函数用法_python中enumerate函数遍历元素用法分析
热门文章
- BBEdit 12.6.3 FIXED 特别版 Mac 强大的文本和HTML编辑器及汉化工具
- 《Android之大话设计模式》--设计原则 第三章:开放封闭原则 孙悟空任弼马温一职
- CSS-基础选择器、字体文本属性、引入方式
- 如何使用搜索技巧来成为一名高效的程序员(很好的总结)
- 交出2021年进步答卷,挚文集团如何做到稳中求进?
- python爬虫获取电影天堂中电影的标题与下载地址,并用正则表达匹配电影类型
- 2021-2027全球与中国牛肉罐头市场现状及未来发展趋势
- 电子显示Display基础知识
- excel行列互换_小白学Excel怎么做?|苦苦整理四小时!
- QII中的几个Warning的解决方法