C# 使用PrintDocument打印多页
我正在打印发票。发票应该可以打印在多个页面上,但这就是问题所在。我可以完美地在一页上打印发票,但一旦发票无法在一页上打印,打印作业就会在第一页上停止 这是我正在使用的代码artikelen’是一个文章列表(列表)。我读过几个类似的例子,我相当肯定我在这里遗漏了一些东西 (已编辑:删除一些不必要的代码)C# 使用PrintDocument打印多页,c#,.net,printing,C#,.net,Printing,我正在打印发票。发票应该可以打印在多个页面上,但这就是问题所在。我可以完美地在一页上打印发票,但一旦发票无法在一页上打印,打印作业就会在第一页上停止 这是我正在使用的代码artikelen’是一个文章列表(列表)。我读过几个类似的例子,我相当肯定我在这里遗漏了一些东西 (已编辑:删除一些不必要的代码) public void PrintA4Factuur() { p=新的打印文档(); p、 打印页+= 新的PrintPageEventHandler(printPage); printPrevi
public void PrintA4Factuur()
{
p=新的打印文档();
p、 打印页+=
新的PrintPageEventHandler(printPage);
printPreviewDialog.Document=p;
printPreviewDialog.ShowDialog();
}
无效打印页(对象发送者1,打印页事件参数e1)
{
图形g=e1。图形;
int yPos=320;
浮动页面高度=e1.MarginBounds.Height;
int-artikelPosition=0;
而(yPos+100<页面高度
&&artikelPosition
我发现您的代码的作用正好相反:如果它打印多个页面,它将继续打印到无穷大
尝试将索引位置变量移到PrintPage
事件之外,因为将其设置回零只会将其重新设置为开始:
int artikelPosition = 0;
开始打印时将其重置:
public void PrintA4Factuur()
{
artikelPosition = 0
p = new PrintDocument();
p.PrintPage += printPage;
printPreviewDialog.Document = p;
printPreviewDialog.ShowDialog();
}
然后在PrintPage例程中对其进行注释:
void printPage(object sender1, PrintPageEventArgs e1)
{
Graphics g = e1.Graphics;
int yPos = 320;
float pageHeight = e1.MarginBounds.Height;
// int artikelPosition = 0;
// continue with code
}
Lars指出了在每页开始时将artikelPosition重置为零的问题,但是这个代码还有一些其他问题 您应该始终使用
e1.MarginBounds
对于坐标,因为用户可以更改页边距,p.DefaultPageSettings
将不包括该设置
使用字体度量,如GetHeight(yourDeviceGraphPort)
,不要硬编码行高
始终使用float
s作为坐标,不要在int
s之间转换
字体是非托管资源,在使用完字体后必须Dispose
处理它们。在循环中重复创建和处理字体是低效的;在调用PrintDocument.Print()
之前构造字体,并在打印完所有页面后进行处理
在
系统中已经定义了一个黑色的SolidBrush。Drawing
实现了这一点。现在是给自己一记耳光的好时机。非常感谢!重述一下,printPage()方法是为每页调用的,而不是为每个打印作业调用的,对吗?这可以解释我的错误。@StefanM完全正确。这就是为什么将YPO保留在printPage
方法中起作用,因为这是打印行的起点。
void printPage(object sender1, PrintPageEventArgs e1)
{
Graphics g = e1.Graphics;
int yPos = 320;
float pageHeight = e1.MarginBounds.Height;
// int artikelPosition = 0;
// continue with code
}