2012-04-19 118 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。