打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
打印DataGridView内容的类
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;
using System.Drawing;
namespace 数据导出
{
    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> 
        /// <param name="footer">页脚</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 - 2; 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;
        }
    }
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
datagridview 的selectionMode设置为fullColumnselecte时,列的sortMode不能设置为automatic
最高效的分页存储过程
生成SQL语句分页的通用C#函数
mysql、sqlserver、oracle分页,java分页统一接口实现
S2SH项目实现分页功能
分页标签:pager
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服