C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: DataGridViewの印刷


(過去ログ 62 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■35761 / inTopicNo.1)  DataGridViewの印刷
  
□投稿者/ hito (1回)-(2009/05/13(Wed) 14:35:03)

分類:[.NET 全般] 

はじめまして、hitoといいます。
現在、VB2008にて、データベースから取得したデータをDataGridViewに表示させており、
その内容を印刷したいと考えております。
下記のソースは、私が書いたものなのですが、
  Private WithEvents PrintDocument1 As New System.Drawing.Printing.PrintDocument()
Private Sub Print_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Print.Click
'file()
' 印刷処理を実行
'PrintDocument1.Print()
'PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.FullWindow)
'PrintDocumentオブジェクトの作成
Dim pd As New System.Drawing.Printing.PrintDocument
'PrintPageイベントハンドラの追加
AddHandler pd.PrintPage, AddressOf pd_PrintPage

'PrintDialogクラスの作成
Dim pdlg As New PrintDialog
'PrintDocumentを指定
pdlg.Document = pd
'印刷の選択ダイアログを表示する
If pdlg.ShowDialog() = DialogResult.OK Then
'OKがクリックされた時は印刷する
pd.Print()
End If

End Sub
Private Sub pd_PrintPage(ByVal sender As Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs)

Dim g As Graphics = e.Graphics

'DataGridViewのCellを書き込む
g.DrawString(DataGridView1(0, 0).Value, _
New Font("MS Pゴシック", 12), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top)

'このページで終了
e.HasMorePages = False
End Sub
ここで質問なのですが、表示されている部分のみでなく、DataGridView全体を印刷したいのですが、pd_PrintPageの
g.DrawStringでDataGridViewのCellの値を書き込むのですが、列、行ともに多く、すべてのCellの値を書き込むとなると
膨大なソースを書かなければならないので、g.DrawStringの部分をループ処理で行いたいと考えているのですが、
ソースの書き方が分かりません・・・
情けない質問ですが、もし分かるという方いらっしゃましたら、ご教授ください。
よろしくお願いします。
引用返信 編集キー/
■35763 / inTopicNo.2)  Re[1]: DataGridViewの印刷
□投稿者/ hito (2回)-(2009/05/13(Wed) 14:50:54)
No35761 (hito さん) に返信
すみません、初めてこちらの掲示板を利用させていただいたんですが、最後の分類を何も設定せずに書き込んでしまいました。
本題にも書いてありますが、環境は、VB2008です。
引用返信 編集キー/
■35773 / inTopicNo.3)  Re[2]: DataGridViewの印刷
□投稿者/ ぽぴ王子 (435回)-(2009/05/13(Wed) 16:40:06)
ぽぴ王子 さんの Web サイト
No35763 (hito さん) に返信

いきなりずらずらっとコードが出てくると「なに、コードを読んで動きを理解しろってか?」と警戒する
人もいるかもしれません。
あ、あとコードを載せるときは「図表モード」ってのにチェックを入れておくといいです。

質問内容としては以下の部分ということでいいでしょうか。

> ここで質問なのですが、表示されている部分のみでなく、DataGridView全体を印刷したいのですが、pd_PrintPageの
> g.DrawStringでDataGridViewのCellの値を書き込むのですが、列、行ともに多く、すべてのCellの値を書き込むとなると
> 膨大なソースを書かなければならないので、g.DrawStringの部分をループ処理で行いたいと考えているのですが、
> ソースの書き方が分かりません・・・

コードとして注目すべき点はここ、ということで。

>         'DataGridViewのCellを書き込む
>         g.DrawString(DataGridView1(0, 0).Value, _
>                      New Font("MS Pゴシック", 12), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top)

DataGridView1(0, 0).Value の (0, 0) をループすればいいのはだいたい理解していると想定します。
問題は e.MarginBounds.Left と e.MarginBounds.Top をずらして出力してあげればいいわけだけど
どの程度ずらせばいいのかしらん?という話かな。

ざっと書いてみました。C# で書いたものを脳内で VB に変換しているので、動かないかもしれませんが。

    Dim X As Integer
    Dim Y As Integer

    Y = e.MarginBounds.Top;
    For i As Integer = 0 To DataGridView1.Rows.Count - 1
        X = e.MarginBounds.Left;
        For j As Integer = 0 To DataGridView1.Columns.Count - 1
            g.DrawString(DataGridView1(j, i).Value, _
                New Font("MS Pゴシック", 12), Brushes.Black, X, Y)
            X += DataGridView1.Columns(j).Width;
        Next
        Y += dataGridView1.Rows(i).Height;
    Next

実際のところは、X と Y に加算する値はもう少し計算が必要ではないかと思います。
あとはこれだと文字列が描かれるだけなので、罫線も自分で描かないといけません。

ページングとか、いろいろな要素が組み合わされると結構印刷は面倒だったりするので、CrystalReports とか
ActiveReports なんかを使うのが現実的かもしれませんね。

引用返信 編集キー/
■35781 / inTopicNo.4)  Re[3]: DataGridViewの印刷
□投稿者/ hito (3回)-(2009/05/13(Wed) 17:53:44)
No35773 (ぽぴ王子 さん) に返信
回答ありがとうございます。
一応、記載していただいたソースを多少手直しして実行してみました。
ですがその中で、        
          For j As Integer = 0 To DataGridView1.Columns.Count - 1
                If DataGridView1(j, i).Value.ToString <> "" Then
                    g.DrawString(DataGridView1(j, i).Value.ToString, _
                        New Font("MS Pゴシック", 12), Brushes.Black, X, Y)
                    X += DataGridView1.Columns(j).Width
                End If
          Next j
の、
g.DrawString(DataGridView1(j, i).Value.ToString, _
    New Font("MS Pゴシック", 12), Brushes.Black, X, Y)
部分で、
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
というエラーが出てしまいます。
DataGridViewのCellの値には、Null値を格納する場合もありますので、
おそらく、Nullの値を書き込むことはできないということで
このエラーが出ていると思うのですが、
この場合どう対処したらよいでしょうか。
すみません、質問のしっ放しで・・・

引用返信 編集キー/
■35790 / inTopicNo.5)  Re[4]: DataGridViewの印刷
□投稿者/ ぽぴ王子 (437回)-(2009/05/13(Wed) 19:49:52)
ぽぴ王子 さんの Web サイト
2009/05/13(Wed) 20:17:11 編集(投稿者)
No35781 (hito さん) に返信

> g.DrawString(DataGridView1(j, i).Value.ToString, _
>     New Font("MS Pゴシック", 12), Brushes.Black, X, Y)
> 部分で、
> 「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
> というエラーが出てしまいます。

ということは、nullであれば空文字にするなどの処理をしてあげればいいですね。

    Dim s As String

のような感じで、String 型の変数を用意しておいて

    If DataGridView(j, i).Value Is Nothing Then
        s = ""
    Else
        s = DataGridView(j, i).Value.ToString
    End If
    g.DrawString(s, New Font("MS Pゴシック", 12), Brushes.Black, X, Y)

という感じでどうでしょうか。あんまりスマートではないかもしれませんが。

# Nothing との比較が間違っていた気がするので修正

引用返信 編集キー/
■35803 / inTopicNo.6)  Re[5]: DataGridViewの印刷
□投稿者/ hito (4回)-(2009/05/14(Thu) 09:27:32)
No35790 (ぽぴ王子 さん) に返信
ありがとうございます。
何とかDataGridView全体の値を印刷することができました。

とりあえず、最終的に出来上がったソースを載せておきます。

    Private WithEvents PrintDocument1 As New System.Drawing.Printing.PrintDocument()
    Private Sub Print_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Print.Click
        'file()
        ' 印刷処理を実行
        'PrintDocument1.Print()
        'PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.FullWindow)
        'PrintDocumentオブジェクトの作成
        Dim pd As New System.Drawing.Printing.PrintDocument
        'PrintPageイベントハンドラの追加
        AddHandler pd.PrintPage, AddressOf pd_PrintPage

        'PrintDialogクラスの作成
        Dim pdlg As New PrintDialog
        'PrintDocumentを指定
        pdlg.Document = pd
        '印刷の選択ダイアログを表示する
        If pdlg.ShowDialog() = DialogResult.OK Then
            'OKがクリックされた時は印刷する
            pd.Print()
        End If

    End Sub
    Private Sub pd_PrintPage(ByVal sender As Object, _
        ByVal e As System.Drawing.Printing.PrintPageEventArgs)

        Dim g As Graphics = e.Graphics

        '文字列を描く
        'g.DrawString(DataGridView1(0, 0).Value, _
        '            New Font("MS Pゴシック", 12), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top)
        Dim X As Integer
        Dim Y As Integer

        Y = e.MarginBounds.Top
        For i As Integer = 0 To DataGridView1.Rows.Count - 1
            X = e.MarginBounds.Left
            For j As Integer = 0 To DataGridView1.Columns.Count - 1
                Dim s As String
                If DataGridView1(j, i).Value Is Nothing Then
                    s = ""
                Else
                    s = DataGridView1(j, i).Value
                End If
                g.DrawString(s, New Font("MS Pゴシック", 9), Brushes.Black, X, Y)
                'g.DrawString(DataGridView1(j, i).Value.ToString, _
                '   New Font("MS Pゴシック", 12), Brushes.Black, X, Y)
                X += DataGridView1.Columns(j).Width
            Next j
            Y += DataGridView1.Rows(i).Height
        Next i

        'このページで終了
        e.HasMorePages = False

    End Sub

RowとColumnを同時に移動させるという書き方が分からなかったのですが、
今回の件で新しい知識も得ることが出来ましたのでよかったです。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -