2016年1月22日金曜日

VB.NET 印刷プレビュー後に印刷するとプリンターから白紙が出力されてしまう

VB.NETのブログラムで印刷プレビューをしてからプリンターボタンをクリックして印刷を開始すると、プリンターから白紙が出力されてしまう。印刷プレビューには正しく表示されるのに、何故なのか悩んでしまった。


ネットで検索すると、力業的な解決方法をしている人も見受けられた。しかし、もっとスマートな解決方法をと思って検索していると、そもそも印刷プレビューと印刷の関係を知らないことに気付かされた。

そこでイベントの発生順序を確認するため、Visual Studioでデバッグすると、
先ず、印刷プレビューを実行すると、PrintDocument1.PrintPageイベントハンドラーが実行される。

続いて、印刷ボタンをクリックすると、何と再びPrintDocument1.PrintPageイベントハンドラーが実行されていた。

そうか。2回PrintDocument1.PrintPageイベントハンドラーが実行されるので、2回目の印刷の際は該当データが無くて空白が印刷されるのか。

原因が分かってしまえば対処は簡単。

単一ページを印刷する場合は、PrintDocument1.PrintPageイベントハンドラー内の最後に静的変数の値を最初の値に戻してあげれば良い。

複数ページを印刷する場合は、PrintDocument1.PrintPageイベントハンドラー内でe.HasMorePages = Trueを代入して、PrintDocument1.PrintPageイベントハンドラーの再帰をするが、最後のページを印刷した後は、e.HasMorePages = Trueを代入しない。そのタイミングで静的変数の値を最初の値に戻してあげれば良い。

ネット上にはこの事が分からずに、白紙が出力されるのでプリンターボタンをクリックしても印刷できなくしたいという質問があった。それではあまりにもユーザーが可哀相だ。

1 件のコメント:

  1. 再現できないんスけど
    Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.PrintPreviewDialog1.Document = Me.PrintDocument1
    Me.PrintPreviewDialog1.ShowDialog()
    End Sub

    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    e.Graphics.DrawLine(New Pen(Color.Red), 200, 300, 500, 600)
    End Sub
    End Class

    返信削除