Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用PrintDocument打印多页_C#_.net_Printing - Fatal编程技术网

C# 使用PrintDocument打印多页

C# 使用PrintDocument打印多页,c#,.net,printing,C#,.net,Printing,我正在打印发票。发票应该可以打印在多个页面上,但这就是问题所在。我可以完美地在一页上打印发票,但一旦发票无法在一页上打印,打印作业就会在第一页上停止 这是我正在使用的代码artikelen’是一个文章列表(列表)。我读过几个类似的例子,我相当肯定我在这里遗漏了一些东西 (已编辑:删除一些不必要的代码) public void PrintA4Factuur() { p=新的打印文档(); p、 打印页+= 新的PrintPageEventHandler(printPage); printPrevi

我正在打印发票。发票应该可以打印在多个页面上,但这就是问题所在。我可以完美地在一页上打印发票,但一旦发票无法在一页上打印,打印作业就会在第一页上停止

这是我正在使用的代码artikelen’是一个文章列表(列表)。我读过几个类似的例子,我相当肯定我在这里遗漏了一些东西

(已编辑:删除一些不必要的代码)

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
}