我正在尝试打印发票。发票应该能够在多页上打印,但这就是问题出现的地方。我可以在单页上完美地打印发票,但是一旦发票不适合在单页上打印,打印作业就会退出第一页。
这是我正在使用的代码。 'artikelen' 是文章列表(List)。我读过几个类似的例子,我相当确定我在这里遗漏了一些东西。
(编辑:删除了一些不必要的代码)
public void PrintA4Factuur()
{
p = new PrintDocument();
p.PrintPage +=
new PrintPageEventHandler(printPage);
printPreviewDialog.Document = p;
printPreviewDialog.ShowDialog();
}
void printPage(object sender1, PrintPageEventArgs e1)
{
Graphics g = e1.Graphics;
int yPos = 320;
float pageHeight = e1.MarginBounds.Height;
int artikelPosition = 0;
while (yPos + 100 < pageHeight
&& artikelPosition < this.artikelen.Count)
{
// Do stuff with articles (printing details in different rectangles
artikelPosition += 1;
yPos += 20;
}
if (artikelPosition < this.artikelen.Count)
{
e1.HasMorePages = true;
return;
}
else
{
e1.HasMorePages = false;
}
}
好吧,拉斯指出了重置的问题artikelPosition
在每个页面的开头为零,但是此代码还存在一些其他问题。
你应该总是使用e1.MarginBounds
对于坐标,因为用户可以更改边距,并且p.DefaultPageSettings
不会包括那个。
使用字体指标,例如GetHeight(yourDeviceGraphPort)
,不要硬编码行高。
总是使用float
s 为坐标,不进行相互转换int
s.
字体是非托管资源,您必须Dispose
当你用完它们时。在循环中重复创建和处理字体效率低下;在调用之前构造它PrintDocument.Print()
并在打印完所有页面后将其丢弃。
还有一个 Black SolidBrush 已经定义在System.Drawing
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)