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

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

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  
}  

}

格式是不是设置错了呢

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

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