zoukankan      html  css  js  c++  java
  • Winform打印封装类

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Drawing.Printing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Red.Utility.Common.Print
    {
        public static class PrintDataGridView
        {
            static DataGridView dgv;
            static string titleName = ""; //标题名称       
            static string titleName2 = ""; //第二标题名称     
            static int rowIndex = 0;   //当前行       
            static int page = 1; //当前页      
    
            static int rowsPerPage = 0;  //每页显示多少行
    
            private static bool landscape = false;
            /// <summary>
            /// 打印方向 横向true
            /// </summary>
            public static bool Landscape
            {
                get { return PrintDataGridView.landscape; }
                set { PrintDataGridView.landscape = value; }
            }
    
            /// <summary>
            /// 打印DataGridView
            /// </summary>
            /// <param name="dataGridView">要打印的DataGridView</param>
            /// <param name="title">标题</param>
            /// <param name="title2">第二标题,可以为null</param>
            public static void Print(DataGridView dataGridView, string title, string title2)
            {
                try
                {
                    if (dataGridView == null) { return; }
                    titleName = title;
                    titleName2 = title2;
                    dgv = dataGridView;
                    PrintPreviewDialog ppvw = new PrintPreviewDialog();
                    ppvw.PrintPreviewControl.Zoom = 1.0; //显示比例为100%
                    PrintDocument printDoc = new PrintDocument();
                    PrintDialog MyDlg = new PrintDialog();
                    MyDlg.Document = printDoc;
                    printDoc.DefaultPageSettings.PaperSize = new PaperSize("A4", 827, 1169);
                    printDoc.DefaultPageSettings.Margins = new Margins(15, 30, 60, 60); //设置边距             
                    ppvw.Document = printDoc;   //设置要打印的文档               
                    ((Form)ppvw).WindowState = FormWindowState.Maximized; //最大化               
                    rowIndex = 0; //当前行              
                    page = 1;  //当前页                             
                    printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage); //打印事件 
                    printDoc.EndPrint += new PrintEventHandler(printDoc_EndPrint);
                    ppvw.Document.DefaultPageSettings.Landscape = Landscape;    // 设置打印方向 横向true              
                    ppvw.ShowDialog(); //打开预览
    
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
    
            }
    
            static void printDoc_EndPrint(object sender, PrintEventArgs e)
            {
                rowIndex = 0; //当前行          
                page = 1;  //当前页            
                rowsPerPage = 0;//每页显示多少行
            }
            private static void printDoc_PrintPage(object sender, PrintPageEventArgs e)
            {
    
                //标题字体
                Font titleFont = new Font("微软雅黑", 16, FontStyle.Bold);
                //标题尺寸
                SizeF titleSize = e.Graphics.MeasureString(titleName, titleFont, e.MarginBounds.Width);
                //x坐标
                int x = e.MarginBounds.Left;
                //y坐标
                int y = Convert.ToInt32(e.MarginBounds.Top - titleSize.Height);
                //边距以内纸张宽度
                int pagerWidth = e.MarginBounds.Width;
                //画标题
                e.Graphics.DrawString(titleName, titleFont, Brushes.Black, x + (pagerWidth - titleSize.Width) / 2, y);
                y += (int)titleSize.Height;
                if (titleName2 != null && titleName2 != "")
                {
    
                    //画第二标题
                    e.Graphics.DrawString(titleName2, dgv.Font, Brushes.Black, x + (pagerWidth - titleSize.Width) / 2 + 200, y);
                    //第二标题尺寸
                    SizeF titleSize2 = e.Graphics.MeasureString(titleName2, dgv.Font, e.MarginBounds.Width);
                    y += (int)titleSize2.Height;
    
                }
    
                //表头高度
                int headerHeight = 0;
                //纵轴上 内容与线的距离
                int padding = 6;
                //所有显示列的宽度
                int columnsWidth = 0;
                //计算所有显示列的宽度
                foreach (DataGridViewColumn column in dgv.Columns)
                {
    
                    //隐藏列返回
                    if (!column.Visible) continue;
                    //所有显示列的宽度
                    columnsWidth += column.Width;
                }
    
                //计算表头高度
                foreach (DataGridViewColumn column in dgv.Columns)
                {
    
                    //列宽
                    int columnWidth = (int)(Math.Floor((double)column.Width / (double)columnsWidth * (double)pagerWidth));
                    //表头高度
                    int temp = (int)e.Graphics.MeasureString(column.HeaderText, column.InheritedStyle.Font, columnWidth).Height + 2 * padding;
                    if (temp > headerHeight) headerHeight = temp;
                }
    
                //画表头
    
                foreach (DataGridViewColumn column in dgv.Columns)
                {
    
                    //隐藏列返回
                    if (!column.Visible) continue;
                    //列宽
                    int columnWidth = (int)(Math.Floor((double)column.Width / (double)columnsWidth * (double)pagerWidth));
                    //内容居中要加的宽度
                    float cenderWidth = (columnWidth - e.Graphics.MeasureString(column.HeaderText, column.InheritedStyle.Font, columnWidth).Width) / 2;
                    if (cenderWidth < 0) cenderWidth = 0;
                    //内容居中要加的高度
                    float cenderHeight = (headerHeight + padding - e.Graphics.MeasureString(column.HeaderText, column.InheritedStyle.Font, columnWidth).Height) / 2;
                    if (cenderHeight < 0) cenderHeight = 0;
                    //画背景
                    e.Graphics.FillRectangle(new SolidBrush(Color.LightGray), new Rectangle(x, y, columnWidth, headerHeight));
                    //画边框
                    e.Graphics.DrawRectangle(Pens.Black, new Rectangle(x, y, columnWidth, headerHeight));
                    ////画上边线
    
                    //e.Graphics.DrawLine(Pens.Black, x, y, x + columnWidth, y);
    
                    ////画下边线
    
                    //e.Graphics.DrawLine(Pens.Black, x, y + headerHeight, x + columnWidth, y + headerHeight);
    
                    ////画右边线
    
                    //e.Graphics.DrawLine(Pens.Black, x + columnWidth, y, x + columnWidth, y + headerHeight);
    
                    //if (x == e.MarginBounds.Left)
    
                    //{
    
                    //    //画左边线
    
                    //    e.Graphics.DrawLine(Pens.Black, x, y, x, y + headerHeight);
    
                    //}
    
                    //画内容
                    e.Graphics.DrawString(column.HeaderText, column.InheritedStyle.Font, new SolidBrush(column.InheritedStyle.ForeColor), new RectangleF(x + cenderWidth, y + cenderHeight, columnWidth, headerHeight));
                    x += columnWidth;
    
                }
    
                x = e.MarginBounds.Left;
                y += headerHeight;
                while (rowIndex < dgv.Rows.Count)
                {
    
                    DataGridViewRow row = dgv.Rows[rowIndex];
                    if (row.Visible)
                    {
    
                        int rowHeight = 0;
                        foreach (DataGridViewCell cell in row.Cells)
                        {
    
                            DataGridViewColumn column = dgv.Columns[cell.ColumnIndex];
                            if (!column.Visible || cell.Value == null) continue;
                            int tmpWidth = (int)(Math.Floor((double)column.Width / (double)columnsWidth * (double)pagerWidth));
                            int temp = (int)e.Graphics.MeasureString(cell.Value.ToString(), column.InheritedStyle.Font, tmpWidth).Height + 2 * padding;
                            if (temp > rowHeight) rowHeight = temp;
                        }
    
                        foreach (DataGridViewCell cell in row.Cells)
                        {
    
                            DataGridViewColumn column = dgv.Columns[cell.ColumnIndex];
                            if (!column.Visible) continue;
                            int columnWidth = (int)(Math.Floor((double)column.Width / (double)columnsWidth * (double)pagerWidth));
                            e.Graphics.DrawRectangle(Pens.Black, new Rectangle(x, y, columnWidth, rowHeight));
    
                            if (cell.Value != null)
                            {
    
                                //内容居中要加的宽度
    
                                float cenderWidth = (columnWidth - e.Graphics.MeasureString(cell.Value.ToString(), cell.InheritedStyle.Font, columnWidth).Width) / 2;
    
                                if (cenderWidth < 0) cenderWidth = 0;
    
                                //内容居中要加的高度
    
                                float cenderHeight = (rowHeight + padding - e.Graphics.MeasureString(cell.Value.ToString(), cell.InheritedStyle.Font, columnWidth).Height) / 2;
    
                                if (cenderHeight < 0) cenderHeight = 0;
    
                                ////画下边线
    
                                //e.Graphics.DrawLine(Pens.Black, x, y + rowHeight, x + columnWidth, y + rowHeight);
    
                                ////画右边线
    
                                //e.Graphics.DrawLine(Pens.Black, x + columnWidth, y, x + columnWidth, y + rowHeight);
    
                                //if (x == e.MarginBounds.Left)
    
                                //{
    
                                //    //画左边线
    
                                //    e.Graphics.DrawLine(Pens.Black, x, y, x, y + rowHeight);
    
                                //}
    
                                //画内容
    
                                e.Graphics.DrawString(cell.Value.ToString(), column.InheritedStyle.Font, new SolidBrush(cell.InheritedStyle.ForeColor), new RectangleF(x + cenderWidth, y + cenderHeight, columnWidth, rowHeight));
    
                            }
    
                            x += columnWidth;
    
                        }
    
                        x = e.MarginBounds.Left;
    
                        y += rowHeight;
    
                        if (page == 1) rowsPerPage++;
    
                        //打印下一页
    
                        if (y + rowHeight > e.MarginBounds.Bottom)
                        {
    
                            e.HasMorePages = true;
    
                            break;
    
                        }
    
                    }
    
                    rowIndex++;
    
                }
    
                //页脚
                string footer = " 第 " + page + " 页,共 " + Math.Ceiling(((double)dgv.Rows.Count / rowsPerPage)).ToString() + " 页";
                //画页脚
                e.Graphics.DrawString(footer, dgv.Font, Brushes.Black, x + (pagerWidth - e.Graphics.MeasureString(footer, dgv.Font).Width) / 2, e.MarginBounds.Bottom);
                page++;
    
            }
        }
    }
    

      调用方式

     PrintDataGridView.Print(dataGridView, "刀具列表", "2017-12-22某某打印");
    

      

  • 相关阅读:
    剩余类&完全剩余组
    同余验算法
    一种快速余数求法
    同余的性质II
    同余初步
    求N个数的最小公倍数
    N个数GCD求解法
    快速求解GCD的三个Trick
    质数的几个有趣问题
    等比数列求和公式
  • 原文地址:https://www.cnblogs.com/clear-dream/p/8086780.html
Copyright © 2011-2022 走看看