- PR -

ページ指定印刷について

投稿者投稿内容
オリオリ
会議室デビュー日: 2006/06/29
投稿数: 10
投稿日時: 2006-06-29 11:00
初めて書き込みします。

PrintDialogでページ指定を設定しての印刷で教えてください。

印刷しようとしているのはPrintDocumentの派生クラスです。
このPrintDocumentは基本的にはDataTableのデータを一覧として印刷しますが、
さまざまな条件により改ページしますので、何ページ目のトップにはどのレコードが
くるのかが、一度PirntPageイベントが発生しないとわかりません。

ただ単にDataTableのレコードを一覧印刷するのであれば、
ページ指定のFromPage × 一枚に印刷するレコード数などで
印字を開始するレコードを取得することが可能なのでしょうが、
上記のような状態ですのでその方法をとることができません。

このような場合にページ指定印刷をすることは可能でしょうか。
お知恵をお貸しください。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-29 11:04
引用:

オリオリさんの書き込み (2006-06-29 11:00) より:

さまざまな条件により改ページしますので、何ページ目のトップにはどのレコードが
くるのか
が、一度PirntPageイベントが発生しないと[v]わかりません[/v]。
(snip)
このような場合にページ指定印刷をすることは可能でしょうか。


そのために、System.Windows.Forms.PrintPreviewDialog クラスが存在しているのだと思います。
もちろん、プリンタ ドライバ依存もありますから、完全無欠ではありませんけど。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
オリオリ
会議室デビュー日: 2006/06/29
投稿数: 10
投稿日時: 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
投稿数: 10
投稿日時: 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
投稿数: 10
投稿日時: 2006-06-29 17:17
先ほど書き込んだコードで実行してみたのですが、
やはり10枚全てが印刷されます。

おそらく基本的なことができてないのだろうな
ってことはわかるのですが・・・

どなたか助けてください。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-29 18:05
引用:

オリオリさんの書き込み (2006-06-29 16:57) より:

「一度PrintPageが発生しないとわからない」というのは、PrintPageイベントに印刷内容を記述していく中で、前のページは何レコード目まで印字されていて、このページはどのレコードから印字されるように記述すればいいのかわからないということです。

引用:

現在のページ番号から印刷するレコードのIndexを計算するという方法はとれません。


これについては、自分でカウントを取っていれば、開始するレコード行は判断できるのではないでしょうか。

# いっそ、CrystalReports や、ActiveReports を代表とする
# 帳票コンポーネントを使った方が良いかもしれません。

引用:

このような場合に、e.PageSettings.PrinterSettings.FromPage で、ページ番号を与えられても、そのページにどのレコードを印刷すればよいのか、プログラミングのしようがありません。


ご自身が仰っているように、1 ページの行数が固定されているわけではないですから、
理屈からいって無理ですよね。:-)

引用:

もしかして私の勘違いで、PrintDialogでページ指定をすれば、特別な記述をしなくても、自動で指定ページのみが印刷されるのですか?
(snip)
PrintDialogでページ指定をすれば、指定ページのみが印刷されるのですか?

引用:

先ほど書き込んだコードで実行してみたのですが、 やはり10枚全てが印刷されます。


PrintDialog は、ただの UI ですから、印刷を制御する機能は一切ありません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
オリオリ
会議室デビュー日: 2006/06/29
投稿数: 10
投稿日時: 2006-06-29 20:03
じゃんぬねっとさん、度々のご返信ありがとうございます。

やはり帳票用のコンポーネントを使ったほうがよさそうですね。
同様のことをCrystalReportで作成したのですが、
こちらは正常に動きます。

ただし、CrystalReportではバーコードが使用できないようなので、
ActiveReportのトライアル版で試してみようと思います。

ご親切なご指導ありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-30 00:50
引用:

オリオリさんの書き込み (2006-06-29 20:03) より:

やはり帳票用のコンポーネントを使ったほうがよさそうですね。


いえ、PrintDocument でも要件を満たすことはできるでしょう。

引用:

同様のことをCrystalReportで作成したのですが、こちらは正常に動きます。


何も考えなくても DataSource からレコードを引っ張りますからね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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