2012-04-19 126 views
3

我试图打印发票。发票应该能够打印在多个页面上,但这就是问题发生的地方。我可以在单个页面上完美打印发票,但只要发票不适合单个页面,printjob就会退出第一页。使用PrintDocument打印多个页面

这是我正在使用的代码。 'artikelen'是文章列表(List)。我已经阅读了几个类似的例子,我很确定我在这里错过了一些东西。

(编辑:删除了一些unneccesary代码)

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; 
     } 
} 

回答

3

,我发现你的代码做相反:如果打印多页,但它仍然打印到无穷大。

尝试移动你的索引位置变量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 
} 
+0

这样做。这是拍我自己的好时机。非常感谢!回顾一下,每页都会调用printPage()方法,而不是每个打印作业,对吧?这将解释我的错误。 – Stefan 2012-04-19 17:28:53

+0

@StefanM的确如此。这就是为什么将yPos保留在'printPage'方法中的原因,因为这是打印行的起点。 – LarsTech 2012-04-19 17:32:18

4

好吧,Lars指出了在每个页面开始时将artikelPosition重置为零的问题,但此代码还存在其他一些问题。

您应始终使用e1.MarginBounds 作为坐标,因为可以由用户更改页边距,并且p.DefaultPageSettings不包括该坐标。

使用像GetHeight(yourDeviceGraphPort)这样的字体指标,不要硬编码行高。

始终使用float s作为坐标,不要在int之间转换s。

字体是非管理资源,当你完成它们时,你必须使用Dispose这些资源。在循环中反复创建和处理字体效率低下;在调用PrintDocument.Print()之前构建它,并在所有页面打印完成后进行处理。

System.Drawing中已经定义了黑色SolidBrush。