- PR -

印刷時の改ページ制御はできますか?

投稿者投稿内容
くーるちゃん
会議室デビュー日: 2003/11/19
投稿数: 9
投稿日時: 2003-12-01 13:26
DataGridで表示した表をIEの印刷機能で印刷したいのですが、行の途中で改ページされてしまいます・・・
改ページは行えるのでしょうか?
情報をお持ちの方はご教授願います。
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2003-12-01 13:31
こんにちは。

回避策になってしまうのですが、
私の場合はページングを使って自動改ページされない程度の行数に抑えるか、
HTMLコントロールのテーブルを使用して、一定の行数に達したらスタイルシートで改ページしています。

[ メッセージ編集済み 編集者: まゆりん 編集日時 2003-12-01 13:33 ]
くーるちゃん
会議室デビュー日: 2003/11/19
投稿数: 9
投稿日時: 2003-12-01 13:42
まゆりんさん、早速のご返事ありがとうございます。ただ、今回はなんとかDataGridを使用したいと考えています・・ DataGridでの改ページ制御はできないのですかね。。。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-01 13:47
引用:

まゆりんさんの書き込み (2003-12-01 13:31) より:
HTMLコントロールのテーブルを使用して、一定の行数に達したらスタイルシートで改ページしています。


 スタイルシートを使うなら、DataGridでもかまわないのでは?DataGridはテーブル要素として出力されますよ。
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2003-12-01 14:10
引用:

Jittaさんの書き込み (2003-12-01 13:47) より:
 スタイルシートを使うなら、DataGridでもかまわないのでは?DataGridはテーブル要素として出力されますよ。



そうなんですが、スタイルシートの改ページ(page-break-before、page-break-after)は、
要素と要素の間でないと有効ではないようなのです。
DataGridはひとつのTable要素として出力されますので、任意の行で改ページ出来ませんでした。
で、仕方がないので普通のTableを使って任意の行数までに至ったら一度Tableを閉じて
page-break-afterを入れてまたTableを・・・と手間の掛かることをしてました。

----------------------------------------------
【追記】
市販のコンポーネントソフトなら可能みたいですね。
GrapeCityとか。(って前にも言った記憶が・・・)


[ メッセージ編集済み 編集者: まゆりん 編集日時 2003-12-01 14:27 ]
くーるちゃん
会議室デビュー日: 2003/11/19
投稿数: 9
投稿日時: 2003-12-01 15:03
勉強不足で申し訳ありませんが具体的にどのようにすれば改ページ設定されるのでしょうか?
申し訳ないですがお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-01 15:22
引用:

まゆりんさんの書き込み (2003-12-01 14:10) より:

そうなんですが、スタイルシートの改ページ(page-break-before、page-break-after)は、要素と要素の間でないと有効ではないようなのです。


 えっと、『HTML&スタイルシート辞典』(ISBN4-7980-0027-2)を参考にしていますが、page-break-before, afterは、「ブロックレベル要素」にしか付けられないですね。ところで、td要素の中には、「ブロックレベル要素」を入れることができます。これを利用できないですかね?DataSetやDataTableを直接DataGridにバインドするのではなく、DataViewを通してからにし、DataViewで適当な行で「改行」用の行を挿入し、その中で「<p id="PageBreak">&nbsp;</p>」、スタイルシートで「p.PageBreak {page-break-after : always}」とか。
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2003-12-01 17:17
引用:

Jittaさんの書き込み (2003-12-01 15:22) より:
 えっと、『HTML&スタイルシート辞典』(ISBN4-7980-0027-2)を参考にしていますが、page-break-before, afterは、「ブロックレベル要素」にしか付けられないですね。ところで、td要素の中には、「ブロックレベル要素」を入れることができます。


ブロックレベル要素ですか。それは知らなかったので勉強になりました。

引用:

これを利用できないですかね?DataSetやDataTableを直接DataGridにバインドするのではなく、DataViewを通してからにし、DataViewで適当な行で「改行」用の行を挿入し、その中で「<p id="PageBreak">&nbsp;</p>」、スタイルシートで「p.PageBreak {page-break-after : always}」とか。


ちょっと試してみましたが、改ページを挿入した行が空欄の状態で表示されてしまい、
見た目的にあまり宜しくなかったです・・・。
#ちゃんと改ページはしてくれましたが。

また、DataViewを使わなくてもDataTableだけで
改ページ処理を追加することも出来ましたが、
空欄行が出来てしまうのはどちらも同じでした。

コード:
            Dim dt As New DataTable()

Dim dr As DataRow

dt.Columns.Add(New DataColumn("aaa", GetType(String)))

<ループ>
dr = dt.NewRow()
If i = 10 Then
dr("aaa") = "<p style=""page-break-after : always"">&nbsp;</p>"
dt.Rows.Add(dr)
dr = dt.NewRow()
End If
dr("aaa") = "あああ"
<ループ>



それと、ひとつのTableを無理矢理改ページしてしまうため
結局行の途中で切れたように印刷されてしまい、
くーるちゃんさんの希望に沿わない結果になってしまうと思うのですが。
#切れるのは改行処理を入れた空欄行だけなので、
#データが切れていなければ良いということであれば、話は別です。

-------------
コード修正

[ メッセージ編集済み 編集者: まゆりん 編集日時 2003-12-01 17:19 ]

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