3

請求書を印刷しようとしています。請求書は複数のページに印刷できるはずですが、ここで問題が発生します。請求書を1ページに完全に印刷できますが、請求書が1ページに収まらない場合は、印刷ジョブが終了します。最初のページ。

これが私が使用しているコードです。「artikelen」は記事のリスト(リスト)です。私はいくつかの同様の例を読みました、そして私はここで何かが欠けているとかなり確信しています。

(編集:不要なコードを削除)

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

2 に答える 2

4

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

e1.MarginBounds 余白はユーザーが変更でき、余白は含まれないため、常に座標に使用する必要がp.DefaultPageSettingsあります。

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

座標には常にfloatsを使用し、s間で変換しないでくださいint

フォントは管理されていないリソースであるため、使い終わったらフォントを使用する必要がありDisposeます。ループ内でフォントを繰り返し作成して破棄するのは非効率的です。呼び出す前に作成しPrintDocument.Print()、すべてのページが印刷されたら破棄します。

ですでに定義されているBlackSolidBrushもありSystem.Drawingます。

于 2012-04-19T17:39:38.533 に答える
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
}
于 2012-04-19T17:25:49.480 に答える