博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WinForm中的简单打印
阅读量:6155 次
发布时间:2019-06-21

本文共 10535 字,大约阅读时间需要 35 分钟。

最近工作很是郁闷,有做WEB又要改桌面程序,要求之前基于DevExpress报表打印改成 DataGridView呈现数据 ,配置30分钟提醒用户打印,我发现我是越来越懒了,主要是情绪不好,什么问题 第一反应肯定谷歌之然后自己封装下,无暇思考,万能的谷歌啊

View Code
public class Printer    {        private DataGridView dataview;        private PrintDocument printDoc;        //打印有效区域的宽度        int width;        int height;        int columns;        double Rate;        bool hasMorePage = false;        int currRow = 0;        int rowHeight = 20;        //打印页数        int PageNumber;        //当前打印页的行数        int pageSize = 20;        //当前打印的页码        int PageIndex;        int AreaHeight;        private int PageWidth; //打印纸的宽度        private int PageHeight; //打印纸的高度        private int LeftMargin; //有效打印区距离打印纸的左边大小        private int TopMargin;//有效打印区距离打印纸的上面大小        private int RightMargin;//有效打印区距离打印纸的右边大小        private int BottomMargin;//有效打印区距离打印纸的下边大小        int rows;        private string[] footer;        /**/        ///         /// 构造函数        ///         /// 要打印的DateGridView        /// PrintDocument用于获取打印机的设置        public Printer(DataGridView dataview, PrintDocument printDoc, string[] footer)        {            this.footer = footer;            this.dataview = dataview;            this.printDoc = printDoc;            PageIndex = 0;            //获取打印数据的具体行数            this.rows = dataview.RowCount;            this.columns = dataview.ColumnCount;            //判断打印设置是否是横向打印            if (!printDoc.DefaultPageSettings.Landscape)            {                PageWidth = printDoc.DefaultPageSettings.PaperSize.Width;                PageHeight = printDoc.DefaultPageSettings.PaperSize.Height;            }            else            {                PageHeight = printDoc.DefaultPageSettings.PaperSize.Width;                PageWidth = printDoc.DefaultPageSettings.PaperSize.Height;            }            LeftMargin = printDoc.DefaultPageSettings.Margins.Left - 50;            TopMargin = printDoc.DefaultPageSettings.Margins.Top + 60;            RightMargin = printDoc.DefaultPageSettings.Margins.Right;            BottomMargin = printDoc.DefaultPageSettings.Margins.Bottom - 100;            height = PageHeight - TopMargin - BottomMargin - 2;            width = PageWidth - LeftMargin - RightMargin - 2;            double tempheight = height;            double temprowHeight = rowHeight;            while (true)            {                string temp = Convert.ToString(tempheight / Math.Round(temprowHeight, 3));                int i = temp.IndexOf('.');                double tt = 100;                if (i != -1)                {                    tt = Math.Round(Convert.ToDouble(temp.Substring(temp.IndexOf('.'))), 3);                }                if (tt <= 0.01)                {                    rowHeight = Convert.ToInt32(temprowHeight);                    break;                }                else                {                    temprowHeight = temprowHeight + 0.01;                }            }            pageSize = height / rowHeight;            if ((rows + 1) <= pageSize)            {                pageSize = rows + 1;                PageNumber = 1;            }            else            {                PageNumber = rows / (pageSize - 1);                if (rows % (pageSize - 1) != 0)                {                    PageNumber = PageNumber + 1;                }            }        }        /**/        ///         /// 初始化打印        ///         private void InitPrint()        {            PageIndex = PageIndex + 1;            if (PageIndex == PageNumber)            {                hasMorePage = false;                if (PageIndex != 1)                {                    pageSize = rows % (pageSize - 1) + 1;                }            }            else            {                hasMorePage = true;            }        }        //打印头        private void DrawHeader(Graphics g)        {            Font font = new Font("宋体", 11, FontStyle.Regular);            int temptop = (rowHeight / 2) + TopMargin + 1;            int templeft = LeftMargin + 1;            for (int i = 0; i < this.columns; i++)            {                string headString = this.dataview.Columns[i].HeaderText;                float fontHeight = g.MeasureString(headString, font).Height;                float fontwidth = g.MeasureString(headString, font).Width;                float temp = temptop - (fontHeight) / 3;                g.DrawString(headString, font, Brushes.Black, new PointF(templeft, temp));                templeft = templeft + (int)(this.dataview.Columns[i].Width / Rate) + 1;            }        }        //画表格        private void DrawTable(Graphics g)        {            Rectangle border = new Rectangle(LeftMargin, TopMargin, width, (pageSize) * rowHeight);            g.DrawRectangle(new Pen(Brushes.Black, 1), border);            for (int i = 1; i < pageSize; i++)            {                if (i != 1)                {                    g.DrawLine(new Pen(Brushes.Black, 1), new Point(LeftMargin + 1, (rowHeight * i) + TopMargin + 1), new Point(width + LeftMargin, (rowHeight * i) + TopMargin + 1));                }                else                {                    g.DrawLine(new Pen(Brushes.Black, 1), new Point(LeftMargin + 1, (rowHeight * i) + TopMargin + 1), new Point(width + LeftMargin, (rowHeight * i) + TopMargin + 1));                }            }            //计算出列的总宽度和打印纸比率            Rate = Convert.ToDouble(GetDateViewWidth()) / Convert.ToDouble(width);            int tempLeft = LeftMargin + 1;            int endY = (pageSize) * rowHeight + TopMargin;            for (int i = 1; i < columns; i++)            {                tempLeft = tempLeft + 1 + (int)(this.dataview.Columns[i - 1].Width / Rate);                g.DrawLine(new Pen(Brushes.Black, 1), new Point(tempLeft, TopMargin), new Point(tempLeft, endY));            }        }        /**/        ///         /// 获取打印的列的总宽度        ///         /// 
private int GetDateViewWidth() { int total = 0; for (int i = 0; i < this.columns; i++) { total = total + this.dataview.Columns[i].Width; } return total; } //打印行数据 private void DrawRows(Graphics g) { Font font = new Font("宋体", 11, FontStyle.Regular); int temptop = (rowHeight / 2) + TopMargin + 1 + rowHeight; for (int i = currRow; i < pageSize + currRow - 1; i++) { int templeft = LeftMargin + 1; for (int j = 0; j < columns; j++) { string headString = this.dataview.Rows[i].Cells[j].Value.ToString(); float fontHeight = g.MeasureString(headString, font).Height; float fontwidth = g.MeasureString(headString, font).Width; float temp = temptop - (fontHeight) / 3; while (true) { if (fontwidth <= (int)(this.dataview.Columns[j].Width / Rate)) { break; } else { headString = headString.Substring(0, headString.Length - 1); fontwidth = g.MeasureString(headString, font).Width; } } g.DrawString(headString, font, Brushes.Black, new PointF(templeft, temp)); templeft = templeft + (int)(this.dataview.Columns[j].Width / Rate) + 1; } temptop = temptop + rowHeight; } currRow = pageSize + currRow - 1; AreaHeight = temptop; } /**/ /// /// 在PrintDocument中的PrintPage方法中调用 /// /// 传入PrintPage中PrintPageEventArgs中的Graphics ///
是否还有打印页 有返回true,无则返回false
public bool Print(Graphics g) { InitPrint(); DrawTable(g); DrawHeader(g); DrawRows(g); //打印页码 string pagestr = PageIndex + " / " + PageNumber; Font font = new Font("宋体", 11, FontStyle.Regular); g.DrawString(pagestr, font, Brushes.Black, new PointF((PageWidth / 2) - g.MeasureString(pagestr, font).Width, PageHeight - (BottomMargin / 2) - g.MeasureString(pagestr, font).Height)); // 打印查询的功能项名称 return hasMorePage; } }

调用即可

View Code
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)        {            string[] foot = {  };            Printer p = new Printer(this.dgvWarehouseView, printDocument1, foot);            p.Print(e.Graphics);        }            if (DialogResult.OK == MessageBox.Show("请确认需要打印吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information))            {                                  if (this.printDialog1.ShowDialog() == DialogResult.OK)                    {                        this.printDocument1.Print();                    }                            }

订阅提醒打印事件,时间我用Web的缓存做了

public delegate void SettingTimeNotifyDelegateHandler(string time);        public event SettingTimeNotifyDelegateHandler EventSettingTimeNotifyDelegateHandler;                 if (!string.IsNullOrEmpty(this.numTime.Value.ToString()))            {                if (EventSettingTimeNotifyDelegateHandler != null)                {                    EventSettingTimeNotifyDelegateHandler(this.numTime.Value.ToString());                    this.Close();                }            }                     SetTime st = new SetTime();            st.EventSettingTimeNotifyDelegateHandler += (time) =>            {                _time = Convert.ToInt32(time) * 60;                CacheHelper.SetCacheData("SetTimeNoify", "SetTimeNoify", _time);                //this.axWindowsMediaPlayer1.URL = Application.StartupPath + "\\流水.wav";                //this.axWindowsMediaPlayer1.Ctlcontrols.play();            };            st.ShowDialog();           if (!CacheHelper.IsCacheExist("SetTimeNoify"))            {                CacheHelper.SetCacheData("SetTimeNoify", "SetTimeNoify", _time);                this.axWindowsMediaPlayer1.URL = Application.StartupPath + "\\流水.wav";                this.axWindowsMediaPlayer1.Ctlcontrols.play();                //if (MessageBox.Show("系统提醒您打印数据?", "提醒", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK)                //{                //    this.axWindowsMediaPlayer1.Ctlcontrols.stop();                //}            }

转载地址:http://onffa.baihongyu.com/

你可能感兴趣的文章
JSP的隐式对象
查看>>
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>
416. Partition Equal Subset Sum
查看>>
app内部H5测试点总结
查看>>
[TC13761]Mutalisk
查看>>
while()
查看>>
常用限制input的方法
查看>>
IIS7下使用urlrewriter.dll配置
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>
bulk
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>
【算法笔记】多线程斐波那契数列
查看>>
java8函数式编程实例
查看>>
jqgrid滚动条宽度/列显示不全问题
查看>>
在mac OS10.10下安装 cocoapods遇到的一些问题
查看>>
css技巧
查看>>