- - PR -
ページ指定印刷について
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-06-29 11:00
初めて書き込みします。
PrintDialogでページ指定を設定しての印刷で教えてください。 印刷しようとしているのはPrintDocumentの派生クラスです。 このPrintDocumentは基本的にはDataTableのデータを一覧として印刷しますが、 さまざまな条件により改ページしますので、何ページ目のトップにはどのレコードが くるのかが、一度PirntPageイベントが発生しないとわかりません。 ただ単にDataTableのレコードを一覧印刷するのであれば、 ページ指定のFromPage × 一枚に印刷するレコード数などで 印字を開始するレコードを取得することが可能なのでしょうが、 上記のような状態ですのでその方法をとることができません。 このような場合にページ指定印刷をすることは可能でしょうか。 お知恵をお貸しください。 | ||||||||||||||||||||
|
投稿日時: 2006-06-29 11:04
そのために、System.Windows.Forms.PrintPreviewDialog クラスが存在しているのだと思います。 もちろん、プリンタ ドライバ依存もありますから、完全無欠ではありませんけど。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-06-29 16:57
じゃんぬねっとさん、早速のご返信ありがとうございます。
確かにプレビューを表示すれば、結果としてはわかります。 文章で書くのが難しいのですが、 「一度PrintPageが発生しないとわからない」というのは、 PrintPageイベントに印刷内容を記述していく中で、 前のページは何レコード目まで印字されていて、このページは どのレコードから印字されるように記述すればいいのか わからないということです。 例えばDataTableのレコードを順に印刷していくのであれば、 印刷したレコードのIndexを保持していればいいのですが、 DataTableからある条件でレコードを抽出し、 その抽出結果を印刷します。 そしてその条件ごとに改ページしたいのです。 もちろん同じ条件でもレコード数が多ければ改ページされます。 つまり、それぞれのページに印刷されるレコードは、 前のページに依存しますので、 現在のページ番号から印刷するレコードのIndexを計算する という方法はとれません。 このような場合に、 e.PageSettings.PrinterSettings.FromPage で、ページ番号を与えられても、そのページにどのレコードを 印刷すればよいのか、プログラミングのしようがありません。 もしかして私の勘違いで、PrintDialogでページ指定をすれば、 特別な記述をしなくても、自動で指定ページのみが 印刷されるのですか? 例えば、 Dim PageCount As Integer = 1 Private Sub PrintDocument_PrintPage(ByVal sender As Object, _ ByVal e As System.Drawing.Printing.PrintPageEventArgs) Do While PageCount < 10 Dim f As New Font("Arial", 100) e.Graphics.DrawString(PageCount.ToString(), f, Brushes.Black, 0, 0) f.Dispose() e.HasMorePages = True PageCount += 1 Loop e.HasMorePages = False PageCount = 0 End Sub のように単純に10枚印刷するとした場合、 PrintDialogでページ指定をすれば、 指定ページのみが印刷されるのですか? 本当に初歩的ですいません。 もう少しわかりやすい日本語で書ければいいのですが・・・ よろしくお願いいたします。 | ||||||||||||||||||||
|
投稿日時: 2006-06-29 17:12
すいません。
コードがむちゃくちゃでした。 Dim PageCount As Integer = 1 Private Sub PrintDocument_PrintPage(ByVal sender As Object, _ ByVal e As System.Drawing.Printing.PrintPageEventArgs) If PageCount < 10 Then Dim f As New Font("Arial", 100) e.Graphics.DrawString(PageCount.ToString(), f, Brushes.Black, 0, 0) f.Dispose() e.HasMorePages = True PageCount += 1 Exit Sub End If e.HasMorePages = False PageCount = 0 End Sub | ||||||||||||||||||||
|
投稿日時: 2006-06-29 17:17
先ほど書き込んだコードで実行してみたのですが、
やはり10枚全てが印刷されます。 おそらく基本的なことができてないのだろうな ってことはわかるのですが・・・ どなたか助けてください。 | ||||||||||||||||||||
|
投稿日時: 2006-06-29 18:05
これについては、自分でカウントを取っていれば、開始するレコード行は判断できるのではないでしょうか。 # いっそ、CrystalReports や、ActiveReports を代表とする # 帳票コンポーネントを使った方が良いかもしれません。
ご自身が仰っているように、1 ページの行数が固定されているわけではないですから、 理屈からいって無理ですよね。:-)
PrintDialog は、ただの UI ですから、印刷を制御する機能は一切ありません。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2006-06-29 20:03
じゃんぬねっとさん、度々のご返信ありがとうございます。
やはり帳票用のコンポーネントを使ったほうがよさそうですね。 同様のことをCrystalReportで作成したのですが、 こちらは正常に動きます。 ただし、CrystalReportではバーコードが使用できないようなので、 ActiveReportのトライアル版で試してみようと思います。 ご親切なご指導ありがとうございました。 | ||||||||||||||||||||
|
投稿日時: 2006-06-30 00:50
いえ、PrintDocument でも要件を満たすことはできるでしょう。
何も考えなくても DataSource からレコードを引っ張りますからね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |