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を代入しない。そのタイミングで静的変数の値を最初の値に戻してあげれば良い。

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