打印不超过一页的显示正常,超过一页下面的汇总和明细之间就会有一段空格,这是什么原因呢,各位大神,急用,在线等
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,打印数据不超过一页,显示是正常的,超过一页就会多出来空格,是什么设置?