2012-04-19 108 views
3

私は請求書を印刷しようとしています。請求書は複数のページに印刷できるはずですが、問題が発生する場所です。私は1ページに請求書を完全に印刷できますが、請求書が1ページに収まらなくなるとすぐに印刷ジョブが終了します最初のページ。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

私はあなたのコードが反対を行うことが見つかりました:それは1ページ以上を印刷した場合、それが無限大に印刷し続けています。ゼロに戻り、それを設定すると、もう一度始めにそれを設定するため

は、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

+0

@StefanMまさに。だから、yPosを 'printPage'メソッドに残しておくのは、それがあなたの行を印刷するための出発点であるからです。 – LarsTech

4

Larsは、各ページの最初にartikelPositionをゼロにリセットすることで問題を指摘しましたが、このコードには他にもいくつか問題があります。

e1.MarginBounds を使用してください。余白はユーザーによって変更される可能性があり、p.DefaultPageSettingsには含まれません。

GetHeight(yourDeviceGraphPort)のようなフォントメトリックを使用すると、行の高さをハードコードしないでください。

座標には常にfloatを使用してください。intに変換しないでください。

フォントは管理されていないリソースなので、フォントは完了したらDisposeにする必要があります。ループでフォントを繰り返し作成して処理することは効率的ではありません。 PrintDocument.Print()を呼び出してから、すべてのページが印刷された後に処分してください。

System.Drawingで既に定義されているブラックSolidBrushもあります。

関連する問題