VB.NETのブログラムで印刷プレビューをしてからプリンターボタンをクリックして印刷を開始すると、プリンターから白紙が出力されてしまう。印刷プレビューには正しく表示されるのに、何故なのか悩んでしまった。
ネットで検索すると、力業的な解決方法をしている人も見受けられた。しかし、もっとスマートな解決方法をと思って検索していると、そもそも印刷プレビューと印刷の関係を知らないことに気付かされた。
そこでイベントの発生順序を確認するため、Visual Studioでデバッグすると、
先ず、印刷プレビューを実行すると、PrintDocument1.PrintPageイベントハンドラーが実行される。
続いて、印刷ボタンをクリックすると、何と再びPrintDocument1.PrintPageイベントハンドラーが実行されていた。
そうか。2回PrintDocument1.PrintPageイベントハンドラーが実行されるので、2回目の印刷の際は該当データが無くて空白が印刷されるのか。
原因が分かってしまえば対処は簡単。
単一ページを印刷する場合は、PrintDocument1.PrintPageイベントハンドラー内の最後に静的変数の値を最初の値に戻してあげれば良い。
複数ページを印刷する場合は、PrintDocument1.PrintPageイベントハンドラー内でe.HasMorePages = Trueを代入して、PrintDocument1.PrintPageイベントハンドラーの再帰をするが、最後のページを印刷した後は、e.HasMorePages = Trueを代入しない。そのタイミングで静的変数の値を最初の値に戻してあげれば良い。
ネット上にはこの事が分からずに、白紙が出力されるのでプリンターボタンをクリックしても印刷できなくしたいという質問があった。それではあまりにもユーザーが可哀相だ。
再現できないんスけど
返信削除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