C# 打印DataTable 修正版 适应宽度超出一页 数据量超出一页的情况

65 篇文章 0 订阅
22 篇文章 0 订阅

转自:http://www.fx114.net/qa-42-118350.aspx

本篇文章主要介绍了"C# 打印DataTable 修正版 适应宽度超出一页 数据量超出一页的情况",主要涉及到C# 打印DataTable 修正版 适应宽度超出一页 数据量超出一页的情况方面的内容,对于C# 打印DataTable 修正版 适应宽度超出一页 数据量超出一页的情况感兴趣的同学可以参考一下。


网上找来的代码,但是修正了一些问题,特别是在字段超过一张纸宽度时判断不正确的问题感觉导致显示错乱。调用方式如下:

       PrintService printService = new PrintService();
            if (printService.PrintDataTable(GetDataTable())
                MessageBox.Show("打印成功!");

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.IO;
using System.Drawing;
using System.Data;


namespace TaiZhang.Common
{
    internal class PrintService
    {
        public PrintService()
        {


        }


        #region Members //成员
        public String printName = String.Empty;
        public Font prtTextFont = new Font("Verdana", 10);
        public Font prtTitleFont = new Font("宋体", 10);
        private String[] titles = new String[0];
        public String[] Titles
        {
            set
            {
                titles = value as String[];
                if (null == titles)
                {
                    titles = new String[0];
                }
            }
            get
            {
                return titles;
            }
        }
        private Int32 left = 20;
        private Int32 top = 20;
        public Int32 Top { set { top = value; } get { return top; } }
        public Int32 Left { set { left = value; } get { return left; } }
        private DataTable printedTable;
        private Int32 pheight;
        private Int32 pWidth;
        private Int32 pindex;
        private Int32 curdgi;
        private Int32[] width;
        private Int32 rowOfDownDistance = 3;
        private Int32 rowOfUpDistance = 2;


        Int32 startColumnControls = 0;
        Int32 endColumnControls = 0;
        bool iMoreRow = false;//是否为超出的行
        bool iMoreColumn = false;//是否为超出的列


        #endregion


        #region Method for PrintDataTable //打印数据集
        /// <summary>
        /// 打印数据集(无用)
        /// </summary>
        /// <param name="table">数据集</param>
        /// <returns></returns>
        public Boolean PrintDataTable(DataTable table, bool no)
        {
            int pageSize = 32;
            int count = table.Rows.Count;
            for (int pageIndex = 0; pageIndex < Math.Ceiling(Convert.ToDouble(count) / Convert.ToDouble(pageSize)) - 1; pageIndex++)
            {
                DataTable dt = new DataTable();
                foreach (DataColumn col in table.Columns)
                {
                    DataColumn colTemp = new DataColumn();
                    colTemp.ColumnName = col.ColumnName;
                    colTemp.DataType = col.DataType;
                    colTemp.DefaultValue = col.DefaultValue;
                    dt.Columns.Add(colTemp);
                }
                for (int rowIndex = pageIndex * pageSize; rowIndex < pageIndex * pageSize + pageSize; rowIndex++)
                {
                    DataRow dr = dt.NewRow();
                    foreach (DataColumn col in table.Columns)
                    {
                        dr[col.ColumnName] = table.Rows[rowIndex][col.ColumnName];
                    }
                    dt.Rows.Add(dr);
                }
                //PrintDataTableSinglePage(dt);
            }
            return true;
        }
        /// <summary>
        /// 修正版,适应宽度超出一页 数据量超出一页的情况
        /// </summary>
        /// <param name="table"></param>
        /// <returns></returns>
        public Boolean PrintDataTable(DataTable table)
        {
            PrintDocument prtDocument = new PrintDocument();
            try
            {
                if (printName != String.Empty)
                {
                    prtDocument.PrinterSettings.PrinterName = printName;
                }
                prtDocument.DefaultPageSettings.Landscape = true;
                prtDocument.OriginAtMargins = false;
                PrintDialog prtDialog = new PrintDialog();
                prtDialog.AllowSomePages = true;
                prtDialog.ShowHelp = false;
                prtDialog.Document = prtDocument;
                if (DialogResult.OK != prtDialog.ShowDialog())
                {
                    return false;
                }
                printedTable = table;
                pindex = 0;
                curdgi = 0;
                width = new Int32[printedTable.Columns.Count];
                pheight = prtDocument.PrinterSettings.DefaultPageSettings.Bounds.Bottom + 400;
                pWidth = prtDocument.PrinterSettings.DefaultPageSettings.Bounds.Right;
                prtDocument.PrintPage += new PrintPageEventHandler(docToPrint_PrintPage);
                prtDocument.Print();
            }
            catch (InvalidPrinterException ex)
            {
                MessageBox.Show("没有安装打印机");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            prtDocument.Dispose();
            return true;
        }
        #endregion


        #region Handler for docToPrint_PrintPage //设置打印机开始打印的事件处理函数
        /// <summary>
        /// 设置打印机开始打印的事件处理函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="ev"></param>
        private void docToPrint_PrintPage(object sender,
         System.Drawing.Printing.PrintPageEventArgs ev)//设置打印机开始打印的事件处理函数
        {
            Int32 x = left;
            Int32 y = top;
            Int32 rowOfTop = top;
            Int32 i;
            Pen pen = new Pen(Brushes.Black, 1);
            for (i = 0; i < titles.Length; i++)
            {
                ev.Graphics.DrawString(titles[i], prtTitleFont, Brushes.Black, left, y + rowOfUpDistance);
                y += prtTextFont.Height + rowOfDownDistance;
            }
            rowOfTop = y;
            foreach (DataRow dr in printedTable.Rows)
            {
                for (i = 0; i < printedTable.Columns.Count; i++)
                {
                    Int32 colwidth = Convert.ToInt16(ev.Graphics.MeasureString(dr[i].ToString().Trim(), prtTextFont).Width);
                    if (colwidth > width[i])
                    {
                        width[i] = colwidth;
                    }
                }
            }
            if (endColumnControls != 0)
            {
                ev.Graphics.DrawString(printedTable.Columns[0].ColumnName.Trim(), prtTextFont, Brushes.Black, x, y + rowOfUpDistance);
                x += width[0];
            }
            for (i = endColumnControls; i < printedTable.Columns.Count; i++)
            {
                String headtext = printedTable.Columns[i].ColumnName.Trim();
                if (pindex == 0)
                {
                    int colwidth = Convert.ToInt16(ev.Graphics.MeasureString(headtext, prtTextFont).Width);
                    if (colwidth > width[i])
                    {
                        width[i] = colwidth;
                    }
                }
                //判断宽是否越界
                if (x + width[i] > pWidth)
                {
                    break;
                }
                ev.Graphics.DrawString(headtext, prtTextFont, Brushes.Black, x, y + rowOfUpDistance);
                x += width[i];
            }
            startColumnControls = endColumnControls;
            if (i < printedTable.Columns.Count)
            {
                endColumnControls = i;
                ev.HasMorePages = true;
                iMoreColumn = true;
            }
            else
            {
                iMoreColumn = false;
                endColumnControls = printedTable.Columns.Count;
            }
            ev.Graphics.DrawLine(pen, left, rowOfTop, x, rowOfTop);
            y += rowOfUpDistance + prtTextFont.Height + rowOfDownDistance;
            ev.Graphics.DrawLine(pen, left, y, x, y);
            //打印数据
            for (i = curdgi; i < printedTable.Rows.Count; i++)
            {
                x = left;
                if (startColumnControls != 0)
                {
                    ev.Graphics.DrawString(printedTable.Rows[i][0].ToString().Trim(), prtTextFont, Brushes.Black, x, y + rowOfUpDistance);
                    x += width[0];
                }
                for (Int32 j = startColumnControls; j < endColumnControls; j++)
                {
                    ev.Graphics.DrawString(printedTable.Rows[i][j].ToString().Trim(), prtTextFont, Brushes.Black, x, y + rowOfUpDistance);
                    x += width[j];
                }
                y += rowOfUpDistance + prtTextFont.Height + rowOfDownDistance;
                ev.Graphics.DrawLine(pen, left, y, x, y);
                //判断高是否越界
                if (y > pheight - prtTextFont.Height - 450) //if (y > pWidth - prtTextFont.Height - 30)
                {
                    break;
                }
            }
            ev.Graphics.DrawLine(pen, left, rowOfTop, left, y);
            x = left;
            if (startColumnControls != 0)
            {
                x += width[0];
                ev.Graphics.DrawLine(pen, x, rowOfTop, x, y);
            }
            for (Int32 k = startColumnControls; k < endColumnControls; k++)
            {
                x += width[k];
                ev.Graphics.DrawLine(pen, x, rowOfTop, x, y);
            }
            //判断高是否越界
            if (y > pheight - prtTextFont.Height - 450) //if (y > pWidth - prtTextFont.Height - 30) 
            {
                iMoreRow = true;
            }
            else
            {
                iMoreRow = false;
            }
            if (iMoreRow && !iMoreColumn)
            {
                startColumnControls = 0;
                curdgi = i + 1;
                endColumnControls = 0;
                ev.HasMorePages = true;
            }
        }
        #endregion
    }
}

网上找来的代码,但是修正了一些问题,特别是在字段超过一张纸宽度时判断不正确的问题感觉导致显示错乱。调用方式如下:

       PrintService printService = new PrintService();
            if (printService.PrintDataTable(GetDataTable())
                MessageBox.Show("打印成功!");
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.IO;
using System.Drawing;
using System.Data;


namespace TaiZhang.Common
{
    internal class PrintService
    {
        public PrintService()
        {


        }


        #region Members //成员
        public String printName = String.Empty;
        public Font prtTextFont = new Font("Verdana", 10);
        public Font prtTitleFont = new Font("宋体", 10);
        private String[] titles = new String[0];
        public String[] Titles
        {
            set
            {
                titles = value as String[];
                if (null == titles)
                {
                    titles = new String[0];
                }
            }
            get
            {
                return titles;
            }
        }
        private Int32 left = 20;
        private Int32 top = 20;
        public Int32 Top { set { top = value; } get { return top; } }
        public Int32 Left { set { left = value; } get { return left; } }
        private DataTable printedTable;
        private Int32 pheight;
        private Int32 pWidth;
        private Int32 pindex;
        private Int32 curdgi;
        private Int32[] width;
        private Int32 rowOfDownDistance = 3;
        private Int32 rowOfUpDistance = 2;


        Int32 startColumnControls = 0;
        Int32 endColumnControls = 0;
        bool iMoreRow = false;//是否为超出的行
        bool iMoreColumn = false;//是否为超出的列


        #endregion


        #region Method for PrintDataTable //打印数据集
        /// <summary>
        /// 打印数据集(无用)
        /// </summary>
        /// <param name="table">数据集</param>
        /// <returns></returns>
        public Boolean PrintDataTable(DataTable table, bool no)
        {
            int pageSize = 32;
            int count = table.Rows.Count;
            for (int pageIndex = 0; pageIndex < Math.Ceiling(Convert.ToDouble(count) / Convert.ToDouble(pageSize)) - 1; pageIndex++)
            {
                DataTable dt = new DataTable();
                foreach (DataColumn col in table.Columns)
                {
                    DataColumn colTemp = new DataColumn();
                    colTemp.ColumnName = col.ColumnName;
                    colTemp.DataType = col.DataType;
                    colTemp.DefaultValue = col.DefaultValue;
                    dt.Columns.Add(colTemp);
                }
                for (int rowIndex = pageIndex * pageSize; rowIndex < pageIndex * pageSize + pageSize; rowIndex++)
                {
                    DataRow dr = dt.NewRow();
                    foreach (DataColumn col in table.Columns)
                    {
                        dr[col.ColumnName] = table.Rows[rowIndex][col.ColumnName];
                    }
                    dt.Rows.Add(dr);
                }
                //PrintDataTableSinglePage(dt);
            }
            return true;
        }
        /// <summary>
        /// 修正版,适应宽度超出一页 数据量超出一页的情况
        /// </summary>
        /// <param name="table"></param>
        /// <returns></returns>
        public Boolean PrintDataTable(DataTable table)
        {
            PrintDocument prtDocument = new PrintDocument();
            try
            {
                if (printName != String.Empty)
                {
                    prtDocument.PrinterSettings.PrinterName = printName;
                }
                prtDocument.DefaultPageSettings.Landscape = true;
                prtDocument.OriginAtMargins = false;
                PrintDialog prtDialog = new PrintDialog();
                prtDialog.AllowSomePages = true;
                prtDialog.ShowHelp = false;
                prtDialog.Document = prtDocument;
                if (DialogResult.OK != prtDialog.ShowDialog())
                {
                    return false;
                }
                printedTable = table;
                pindex = 0;
                curdgi = 0;
                width = new Int32[printedTable.Columns.Count];
                pheight = prtDocument.PrinterSettings.DefaultPageSettings.Bounds.Bottom + 400;
                pWidth = prtDocument.PrinterSettings.DefaultPageSettings.Bounds.Right;
                prtDocument.PrintPage += new PrintPageEventHandler(docToPrint_PrintPage);
                prtDocument.Print();
            }
            catch (InvalidPrinterException ex)
            {
                MessageBox.Show("没有安装打印机");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            prtDocument.Dispose();
            return true;
        }
        #endregion


        #region Handler for docToPrint_PrintPage //设置打印机开始打印的事件处理函数
        /// <summary>
        /// 设置打印机开始打印的事件处理函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="ev"></param>
        private void docToPrint_PrintPage(object sender,
         System.Drawing.Printing.PrintPageEventArgs ev)//设置打印机开始打印的事件处理函数
        {
            Int32 x = left;
            Int32 y = top;
            Int32 rowOfTop = top;
            Int32 i;
            Pen pen = new Pen(Brushes.Black, 1);
            for (i = 0; i < titles.Length; i++)
            {
                ev.Graphics.DrawString(titles[i], prtTitleFont, Brushes.Black, left, y + rowOfUpDistance);
                y += prtTextFont.Height + rowOfDownDistance;
            }
            rowOfTop = y;
            foreach (DataRow dr in printedTable.Rows)
            {
                for (i = 0; i < printedTable.Columns.Count; i++)
                {
                    Int32 colwidth = Convert.ToInt16(ev.Graphics.MeasureString(dr[i].ToString().Trim(), prtTextFont).Width);
                    if (colwidth > width[i])
                    {
                        width[i] = colwidth;
                    }
                }
            }
            if (endColumnControls != 0)
            {
                ev.Graphics.DrawString(printedTable.Columns[0].ColumnName.Trim(), prtTextFont, Brushes.Black, x, y + rowOfUpDistance);
                x += width[0];
            }
            for (i = endColumnControls; i < printedTable.Columns.Count; i++)
            {
                String headtext = printedTable.Columns[i].ColumnName.Trim();
                if (pindex == 0)
                {
                    int colwidth = Convert.ToInt16(ev.Graphics.MeasureString(headtext, prtTextFont).Width);
                    if (colwidth > width[i])
                    {
                        width[i] = colwidth;
                    }
                }
                //判断宽是否越界
                if (x + width[i] > pWidth)
                {
                    break;
                }
                ev.Graphics.DrawString(headtext, prtTextFont, Brushes.Black, x, y + rowOfUpDistance);
                x += width[i];
            }
            startColumnControls = endColumnControls;
            if (i < printedTable.Columns.Count)
            {
                endColumnControls = i;
                ev.HasMorePages = true;
                iMoreColumn = true;
            }
            else
            {
                iMoreColumn = false;
                endColumnControls = printedTable.Columns.Count;
            }
            ev.Graphics.DrawLine(pen, left, rowOfTop, x, rowOfTop);
            y += rowOfUpDistance + prtTextFont.Height + rowOfDownDistance;
            ev.Graphics.DrawLine(pen, left, y, x, y);
            //打印数据
            for (i = curdgi; i < printedTable.Rows.Count; i++)
            {
                x = left;
                if (startColumnControls != 0)
                {
                    ev.Graphics.DrawString(printedTable.Rows[i][0].ToString().Trim(), prtTextFont, Brushes.Black, x, y + rowOfUpDistance);
                    x += width[0];
                }
                for (Int32 j = startColumnControls; j < endColumnControls; j++)
                {
                    ev.Graphics.DrawString(printedTable.Rows[i][j].ToString().Trim(), prtTextFont, Brushes.Black, x, y + rowOfUpDistance);
                    x += width[j];
                }
                y += rowOfUpDistance + prtTextFont.Height + rowOfDownDistance;
                ev.Graphics.DrawLine(pen, left, y, x, y);
                //判断高是否越界
                if (y > pheight - prtTextFont.Height - 450) //if (y > pWidth - prtTextFont.Height - 30)
                {
                    break;
                }
            }
            ev.Graphics.DrawLine(pen, left, rowOfTop, left, y);
            x = left;
            if (startColumnControls != 0)
            {
                x += width[0];
                ev.Graphics.DrawLine(pen, x, rowOfTop, x, y);
            }
            for (Int32 k = startColumnControls; k < endColumnControls; k++)
            {
                x += width[k];
                ev.Graphics.DrawLine(pen, x, rowOfTop, x, y);
            }
            //判断高是否越界
            if (y > pheight - prtTextFont.Height - 450) //if (y > pWidth - prtTextFont.Height - 30) 
            {
                iMoreRow = true;
            }
            else
            {
                iMoreRow = false;
            }
            if (iMoreRow && !iMoreColumn)
            {
                startColumnControls = 0;
                curdgi = i + 1;
                endColumnControls = 0;
                ev.HasMorePages = true;
            }
        }
        #endregion
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值