tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDataGridViewの内容を印刷
記事No5356
投稿日: 2007/04/18(Wed) 17:50
投稿者シャチ
環境:VB2005&SQLServer

いつもお世話になっております。
DataGridViewの内容をPrintDocumentを使用して印刷を行いたいのですが、
どのようにすれば良いのでしょうか?

DataGridViewの内容をループ処理して取得し、
印刷するようなイメージになるのかと思ってはいるのですが。。。

宜しくお願い致します。

[ツリー表示へ]
タイトルRe: DataGridViewの内容を印刷
記事No5363
投稿日: 2007/04/19(Thu) 01:35
投稿者魔界の仮面弁士
> DataGridViewの内容をループ処理して取得し、
> 印刷するようなイメージになるのかと思ってはいるのですが。。。
そうなると思います。

> どのようにすれば良いのでしょうか?
まず、どこまで分かっているのかを教えてください。

1) PrintDocument の使い方を知っているかどうか。
2) DataGridView に表示されているデータを取得することができるかどうか。
3) それをループで一件ずつ取り出す事ができるかどうか。
4) それらを組み合わせたコードを書く事ができるのかどうか。

[ツリー表示へ]
タイトルRe^2: DataGridViewの内容を印刷
記事No5367
投稿日: 2007/04/19(Thu) 10:21
投稿者シャチ
魔界の仮面弁士さん、返信ありがとうございます。

現在、以下のようなコードになっています。
Dim printText As String = ""
Dim printPosition As Integer
Dim printFont As Font
Dim i As Integer = 0

For Each row As DataGridViewRow In DataGridView1.Rows
 'DataGridView1のデータ取得
   printText = printText & DataGridView1.Item(0, i).Value & Space(10)
   printText = printText & DataGridView1.Item(1, i).Value & Space(10)
   printText = printText & DataGridView1.Item(2, i).Value & Space(10)

  printText = printText & vbLf
   i = i + 1
Next

printPosition = 0
'フォント設定
printFont = New Font("MS Pゴシック", 10)
Dim pd As New System.Drawing.Printing.PrintDocument

'印刷
pd.Print()

DataGridView1のデータ取得は出来るのですが、
PrintDocumentの使い方を理解していないため
どう組み合わせてよいのやらで調べている最中です。

宜しくお願い致します。

[ツリー表示へ]
タイトルRe^3: DataGridViewの内容を印刷
記事No5371
投稿日: 2007/04/19(Thu) 11:27
投稿者魔界の仮面弁士
今回の目的に合致するかどうかは別として、PrintDocument 以外の印刷手法として、
  [SQL Server Reporting Services]
  hhttp://msdn2.microsoft.com/ja-jp/library/ms159106.aspx

  [ReportViewer]
  hhttp://msdn2.microsoft.com/ja-jp/library/ms251771%28VS.80%29.aspx

  [CrystalReport]
  hhttp://msdn2.microsoft.com/ja-jp/library/ms225270%28VS.80%29.aspx
なども、余裕があれば調べてみると良いかも。
# それぞれ使い方が異なるので、今回は触れないでおきますが。


> PrintDocumentの使い方を理解していないため
> どう組み合わせてよいのやらで調べている最中です。

チェックボックスが操作された場合、CheckedChanged イベントが発生しますし、
ボタンが押された場合には、Click イベントが発生しますよね。

そして PrintDocument の場合、「n ページ目の印刷要求があった場合」に、
PrintDocument の「PrintPage イベント」が発生します。つまり実装者は、
PrintPage イベントに『印刷内容を描画するための処理』をコーディングすることになります。



==== (1) 印刷内容の描画処理について ====
テキストの描画には、Graphics クラスを使います。
PrintPage イベント内では、
 TextRenderer.DrawText(e.Graphics, "あいうえお", …)
または
 e.Graphics.DrawString("あいうえお", …)
などの形式で描画できます。
なお、上記「…」の部分には、フォント、描画色(正確にはブラシ)、
座標、レイアウト情報などを指定します。


==== (2) ページ数の概念について ====
PrintPage イベント内で、
 e.HasMorePages = False
と設定した状態でイベントを抜けると、印刷処理が終了します。
(ちなみに、初期値は False です)

そして、このプロパティに
 e.HasMorePages = True
とすると、「まだ次のページがあるので、もう一回イベントを発生させてね」
という意味になります。

なお、現在何ページ目を印刷中であるかといった情報は、自分で管理する必要があります。


==== (3) 印刷設定について ====
プリンタや用紙の指定を行うには、PrintDocument.PrinterSettings プロパティを使います。
ユーザに設定させるために、PrintPreviewDialog を併用すると便利でしょう。

また、ページごとに異なる用紙を使いたい場合などは、PrintPage イベント内で
e.PageSettings を使う事もできます。


==== (4) 印刷処理の開始 ====
プリンタに直接印字するには、PrintDocument.Print メソッドを使います。
あるいは、プレビュー画面を表示したいなら、PrintPreviewDialog を使うこともできます。
より細かな制御が必要なら、PrintPreviewControl を使って、自分のフォーム上に
プレビュー画面を組み込むこともできます。

[ツリー表示へ]
タイトルRe^4: DataGridViewの内容を印刷
記事No5372
投稿日: 2007/04/19(Thu) 11:50
投稿者シャチ
魔界の仮面弁士さん、返信ありがとうございます。

調べてなんとか動くようになりました。(No5367修正しました)
印刷する位置の設定がバイト計算している部分にこれでいいのかという不安はありますが。。。
よりより方法がありましたら、ご教授下さい。
また、色々な情報ありがとうございます。
そのへんも調べて実装してみたいと思います。

Private Sub But_Print_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_Print.Click

' 印刷処理を実行
PrintDocument1.Print()

End Sub

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

 Dim printingText As String = ""
  Dim i As Integer = 0
  Dim RestLength As Integer = 0


  For Each row As DataGridViewRow In DataGridView1.Rows

    '印刷する文字列と位置を設定
    RestLength = System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(DataGridView1.Item(0, i).Value)
    printingText = printingText & DataGridView1.Item(0, i).Value & Space(10 - RestLength)

    RestLength = System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(DataGridView1.Item(1, i).Value)
    printingText = printingText & DataGridView1.Item(1, i).Value & Space(10 - RestLength)

    RestLength = System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(DataGridView1.Item(2, i).Value)
    printingText = printingText & DataGridView1.Item(2, i).Value & Space(10 - RestLength)

    printingText = printingText & vbLf
    i = i + 1

  Next

  PrintString(e, printingText)

End Sub


Private Sub PrintString(ByVal e As System.Drawing.Printing.PrintPageEventArgs, ByVal strPrint As String)
' 印刷ページの描画を行う
e.Graphics.DrawString(strPrint, _
 New Font("MS 明朝", 11), Brushes.Black, _
 e.MarginBounds.Left, e.MarginBounds.Top, _
New StringFormat)
End Sub

[ツリー表示へ]