zoukankan      html  css  js  c++  java
  • WinForm中的简单打印

    最近工作很是郁闷,有做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;
    
            /**/
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="dataview">要打印的DateGridView</param>
            /// <param name="printDoc">PrintDocument用于获取打印机的设置</param>
            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;
                    }
    
                }
    
            }
    
            /**/
            /// <summary>
            /// 初始化打印
            /// </summary>
            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));
                }
    
            }
            /**/
            /// <summary>
            /// 获取打印的列的总宽度
            /// </summary>
            /// <returns></returns>
            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;
    
            }
    
            /**/
            /// <summary>
            /// 在PrintDocument中的PrintPage方法中调用
            /// </summary>
            /// <param name="g">传入PrintPage中PrintPageEventArgs中的Graphics</param>
            /// <returns>是否还有打印页 有返回true,无则返回false</returns>
            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();
                    //}
                }
  • 相关阅读:
    赫夫曼树相关算法
    用栈来实现 括号匹配 字符序列检验
    二叉树的建立和遍历
    数据结构-算术表达式求值
    构造一个单链表L,其头结点指针为head,编写程序实现将L逆置
    单链表的基本操作(C语言)数据结构
    java代码打印杨辉三角
    无标题
    写一个方法,判断给定的数字是偶数还是奇数
    关于生物信息学与R的相关资料和网站
  • 原文地址:https://www.cnblogs.com/Irving/p/2721666.html
Copyright © 2011-2022 走看看