- PR -

PrintPageイベント内の処理について

1
投稿者投稿内容
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2004-10-04 12:59
いつもいつもお世話になります。
さかもと と申します。
=====================
WinXP
VS.Net2003(VB)
SQLSever2000
.netFramework 1.1
=====================

印刷の処理についてご教授頂けたらと思いまして投稿させて頂きます。

現在あるSQL文から取得できるデータを使用者No毎に改頁して
プレビュー表示後,印刷指示を掛ける処理を行おうとしています。
(過去ログから「複数ページに印刷」はPrintPageEventArgsオブジェクト
のHasMorePagesプロパティより設定方法は分かりました。)

 問題はデータ取得をしている間,どのようにPrintPageイベントを呼び出せば
いいのか?ということです。

1:1レコードのデータ取得
2:HasMorePages=True
3:次のレコードのデータ取得


・(最終レコードまで読み込む)

最終レコード取得しHasMorePages=Falseとしプレビュー表示
ということで,イメージは出来るのですが,下記のように
記述したところ1枚に全てのレコードの項目が印刷(重なって)されてしまいます。

======================================================================
ボタンAをクリックして
PrintPreviewDialog1.ShowDialog()
とさせる

Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object,
ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

Static pg As Integer = 1
Dim g As Graphics

略)SQLでデータを取得〜
dr = cmd.ExecuteReader()
While dr.Read = True
strNm = dr.GetString(0)

Select Case pg
Case 1
(1枚目を印刷)
e.HasMorePages = True
Case count(Count最終ページを取得するint型でPrintPageイベント
を呼び出す前に取得しています)
(最後のページを印刷)
e.HasMorePages = False
Case Else
(途中のページを印刷)
e.HasMorePages = True
End Select
pg = pg + 1
End While



End Sub
=========================================================================

PrintPageイベントの中で「データを取得しながら・・・」という処理を加える
のが間違えなのでしょうか?

普段はクリレポを使ってさっと印刷を掛けているのですが,顧客がクリレポと
聞いて拒絶反応(昔のシステムで相当苦労したのでイメージが悪いそうです)
の為,ツールを使わずに印刷を行う必要がありまして・・・。

ご存知の方がいらっしゃいましたらご教授下さい。
宜しくお願い致します。
999
会議室デビュー日: 2003/05/17
投稿数: 14
投稿日時: 2004-10-04 23:41
HasMorePages=True でPrintDocument1_PrintPageイベントを抜けると改ページされ、
再度、PrintDocument1_PrintPageイベントが発生します。
(HasMorePages=falseにするまで)

詳細は、ヘルプを参照して下さい。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdrawingprintingprintdocumentmemberstopic.asp

>PrintPageイベントの中で「データを取得しながら・・・」という処理を加えるのが間違えなのでしょうか?

プレビュー画面の[印刷ボタン]を押すとPrintDocument1_PrintPageイベントが発生すると思いますが、現在のコードだと、再度DBに問い合わせに行くと思われます。
考え方が間違えかどうかは、ご自身で判断してください。



[ メッセージ編集済み 編集者: 999 編集日時 2004-10-04 23:44 ]
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2004-10-05 07:14
999様
おはようございます。

ですよねー・・・。やはり(笑)
現在DataGridに一度表示させておいてそこからindexを拾ってきて
複数印刷するようチャレンジしています。

ありがとうございました。
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2004-10-06 09:58
さかもと です。
先日書き込んだ本件に付きまして,進展(新たな壁にぶつかっただけ)
がありますので書込みさせて頂きます。

処理としては・・・
1:DataGridにデータを取得
2:btnPrintを押し,PrintPreviewDialog1.ShowDialog()を呼び出す
3:PrintDocument1_PrintPage
  3−1:
      Static intCount As Integer =     
      DataGrid1.BindingContext(DataGrid1.DataSource,  
      DataGrid1.DataMember).Count
      strNm(項目名を取得します) = Me.DataGrid1.Item(intIndex, 3)
      intIndex += 1(次のページに移る時にindexをインクリメント)
      とし,グリッドの行を指定しながら項目を取得し続けます。
  3−2:
      Staticで宣言されたpg(ページ数)を判断しながら
      データがあるときは
            e.HasMorePages = True
      データがない時は
            e.HasMorePages = False
      とし,一回の判断毎に
            pg = pg + 1 としていきます


これで,一度の印刷(複数枚数)は可能となりましたが,問題がありまして・・・。
PrintPageイベント内でstatic宣言された変数の数値をどこで初期化するのか?
ということです。初期化しないと,続けて2回印刷をかける時,当然グリッドの
indexが境界を越えてしまうわけで・・・。

PrintPageイベント内でのstatic変数を初期化するにはどのようにしたらいいのでしょうか?

根本的に間違えていたらご指摘願います。
よろしくお願い致します。
999
会議室デビュー日: 2003/05/17
投稿数: 14
投稿日時: 2004-10-06 10:45
PrintDocumentのPrint メソッドより発生するパブリック イベントの順を確認してみてはどうですか?
・BeginPrint---------ドキュメントの最初のページが印刷される前に発生します。
・EndPrint-----------ドキュメントの最後のページが印刷されたときに発生します。
・PrintPage----------現在のページに印刷する出力が必要なときに発生します。
・QueryPageSettings--各 PrintPage イベントの直前に発生します。


[ メッセージ編集済み 編集者: 999 編集日時 2004-10-06 21:06 ]
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2004-10-06 13:43
999様

 さかもとです。
確認いたしました!

教えていただいたようにEndPrintで変数を初期化することで
実現することが出来ました。

PrintPageイベントに関するTipsに固執していて,周りが見えていませんでした・・・(笑)

本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)