qq_28004989
金羽痕
采纳率51.9%
2018-04-04 02:42

C#打印模板问题,打印超过一页,显示有问题

20
已采纳

打印不超过一页的显示正常,超过一页下面的汇总和明细之间就会有一段空格,这是什么原因呢,各位大神,急用,在线等图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • qq87419406 netlocks 3年前

    PrintService printService = new PrintService();

    if (printService.PrintDataTable(GetDataTable())

    MessageBox.Show(“打印成功!” );

    [csharp] 查看纯文本
    使用 系统;

    使用 System.Collections.Generic;

    使用 System.Text;

    使用 System.Drawing.Printing;

    使用 System.Windows.Forms;

    使用 System.IO;

    使用 System.Drawing;

    使用 System.Data;

    命名空间 TaiZhang.Common

    {

    内部类 PrintService

    {

    public PrintService()

    {

        }  
    
    
        #region会员//成员   
        public  String printName = String.Empty;  
        public  Font prtTextFont =  new  Font(“Verdana” ,10);  
        public  Font prtTitleFont =  new  Font(“宋体” ,10);  
        private  String [] titles =  new  String [0];  
        公共 字符串[]标题  
        {  
            组  
            {  
                titles = value  as  String [];  
                if  (null  == titles)  
                {  
                    titles =  new  String [0];  
                }  
            }  
            得到  
            {  
                返回 标题;  
            }  
        }  
        私人 Int32左= 20;  
        private  Int32 top = 20;  
        public  Int32 Top {  set  {top = value; }  get  {  return  top; }}  
        public  Int32 Left {  set  {left = value; }  get  {  return  left; }}  
        私人 DataTable打印表;  
        私人 Int32高度;  
        私人 Int32 pWidth;  
        私人 Int32 pindex;  
        私人 Int32 curdgi;  
        私人 Int32 []宽度;  
        私人 Int32 rowOfDownDistance = 3;  
        私人 Int32 rowOfUpDistance = 2;  
    
    
        Int32 startColumnControls = 0;  
        Int32 endColumnControls = 0;  
        布尔型 iMoreRow =  false ; //是否为超出的行  
        布尔型 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);  
            }  
            返回true ;   
        }  
        /// <summary>  
        ///修正版,适应宽度超出一页数据量超出一页的情况  
        /// </ summary>  
        /// <param name =“table”> </ param>  
        /// <returns> </ returns>  
        公共 布尔值PrintDataTable(DataTable表)  
        {  
            PrintDocument prtDocument =  new  PrintDocument();  
            尝试  
            {  
                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())  
                {  
                    返回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 + =  新的 PrintPageEventHandler(docToPrint_PrintPage);  
                prtDocument.Print();  
            }  
            catch  (InvalidPrinterException ex)  
            {  
                MessageBox.Show(“没有安装打印机” );  
            }  
            catch  (Exception ex)  
            {  
                MessageBox.Show(ex.Message);  
            }  
            prtDocument.Dispose();  
            返回true ;   
        }  
        #endregion  
    
    
        #region Handler  for  docToPrint_PrintPage  //设置打印机开始打印的事件处理函数  
        /// <summary>  
        ///设置打印机开始打印的事件处理函数  
        /// </ summary>  
        /// <param name =“sender”> </ param>  
        /// <param name =“ev”> </ param>  
        私人无效 docToPrint_PrintPage(对象 发件人,   
         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  在 printedTable.Rows)  
            {  
                for  (i = 0; i <printedTable.Columns.Count; i ++)  
                {  
                    Int32 colwidth = Convert.ToInt16(ev.Graphics.MeasureString(dr [i] .ToString()。Trim(),prtTextFont).Width);  
                    如果 (colwidth> width [i])  
                    {  
                        宽度[i] = colwidth;  
                    }  
                }  
            }  
            如果 (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();  
                如果 (pindex == 0)  
                {  
                    int  colwidth = Convert.ToInt16(ev.Graphics.MeasureString(headtext,prtTextFont).Width);  
                    如果 (colwidth> width [i])  
                    {  
                        宽度[i] = colwidth;  
                    }  
                }  
                //判断宽是否越界  
                if  (x + width [i]> pWidth)  
                {  
                    休息;  
                }  
                ev.Graphics.DrawString(headtext,prtTextFont,Brushes.Black,x,y + rowOfUpDistance);  
                x + = width [i];  
            }  
            startColumnControls = endColumnControls;  
            如果 (我<printedTable.Columns.Count)  
            {  
                endColumnControls = i;  
                ev.HasMorePages =  true ;  
                iMoreColumn =  true ;  
            }  
            其他  
            {  
                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 =左边;  
                如果 (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)  
                {  
                    休息;  
                }  
            }  
            ev.Graphics.DrawLine(pen,left,rowOfTop,left,y);  
            x =左边;  
            如果 (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 ;  
            }  
            其他  
            {  
                iMoreRow =  false ;  
            }  
            if  (iMoreRow &&!iMoreColumn)  
            {  
                startColumnControls = 0;  
                curdgi = i + 1;  
                endColumnControls = 0;  
                ev.HasMorePages =  true ;  
            }  
        }  
        #endregion  
    }  
    

    }

    点赞 评论 复制链接分享
  • qq_28004989 金羽痕 3年前

    是纵向的,是在封装好的模板上设计的,没有DIV,打印数据不超过一页,显示是正常的,超过一页就会多出来空格,是什么设置?图片说明

    点赞 评论 复制链接分享
  • huadonghai1314 huadonghai1314 3年前

    看你需求吧,是横向还是纵向。
    比如你需要用A4纸打印,那你就把你需要打印的内容DIV大小比例写死,如:210px :297px
    这期间可能还是会有问题,一点点调就好了。

    点赞 评论 复制链接分享
  • jiangyonghui_198088 放飞自己吧努力 3年前

    格式是不是设置错了呢

    点赞 评论 复制链接分享

相关推荐