none
ReportViewerで印刷ダイアログを表示したくない RRS feed

  • 質問

  •  

    VB2005で開発しています。

     

    ReportViewerを使用して帳票を出力しているのですが、
    印刷ボタンを押したときに、印刷ダイアログボックスが表示されないように
    できませんでしょうか?

     

    印刷ボタンを自作しても良いと考えているのですが、
    PrintDialogメソッドでは、ダイアログボックスが表示されてしまいます。

     

    何か良い方法はございませんでしょうか?

    私なりに調べてみたのですが、解決に至りませんでした。

     

    もしご存じでしたら、ご教示ください。
    よろしくお願いいたします。

    2008年10月8日 1:35

回答

  • 単純な手順はこんな感じ。
    LocalReport.Renderで1ページごとに画像としてMemoryStreamに読み込んで、順にプリンターに出力します。

    Code Snippet

        Private Class PrintToPrinter
            Private streams As New System.Collections.Generic.Queue(Of System.IO.Stream)

            Public Sub Print(ByVal localReport As Microsoft.Reporting.WinForms.LocalReport, _
                             ByVal printdoc As System.Drawing.Printing.PrintDocument)
                Dim deviceInfo As String = "<DeviceInfo><OutputFormat>EMF</OutputFormat></DeviceInfo>"
                Dim warnings() As Microsoft.Reporting.WinForms.Warning = Nothing
                streams.Clear()
                localReport.Render("Image", deviceInfo, AddressOf GetStream, warnings)
                If streams.Count > 0 Then
                    AddHandler printdoc.PrintPage, AddressOf PrintPage
                    printdoc.Print()

                    RemoveHandler printdoc.PrintPage, AddressOf PrintPage
                End If
            End Sub

            Private Function GetStream(ByVal name As String, _
                                       ByVal fileNameExtension As String, _
                                       ByVal encoding As System.Text.Encoding, _
                                       ByVal mimeType As String, _
                                       ByVal willSeek As Boolean) As System.IO.Stream
                Dim ms As New System.IO.MemoryStream()
                streams.Enqueue(ms)
                Return ms
            End Function

            Private Sub PrintPage(ByVal sender As Object, ByVal ev As System.Drawing.Printing.PrintPageEventArgs)
                Using ms As System.IO.Stream = streams.Dequeue()
                    ms.Position = 0
                    Dim pageImage As New System.Drawing.Imaging.Metafile(ms)
                    ev.Graphics.DrawImage(pageImage, ev.PageBounds)
                    ms.Dispose()
                End Using
                ev.HasMorePages = (streams.Count > 0)
            End Sub
        End Class

      

    参考ページはMSDNにあります
    2008年10月8日 12:19

すべての返信

  • ReportViewerのPrintイベントのCancelEventArgsでキャンセルした上で自前で印刷処理をするといいでしょう。

    #ReportViewer8のPageSetupの余白バグの回避に比べたら簡単な処理です
    2008年10月8日 3:29
  • gekkaさん

    ご回答ありがとうございます。

     

    >自前で印刷処理
    自前の印刷処理というのが、うまく理解できませんでした。
    まだうまく理解できていないのですが
    LocalReportオブジェクトなどを利用して、
    印刷するということなのでしょうか?

     

    何か参考になるページなどございましたら、
    ご紹介頂けませんでしょうか?
    よろしくお願いいたします。

     

    2008年10月8日 10:41
  • 単純な手順はこんな感じ。
    LocalReport.Renderで1ページごとに画像としてMemoryStreamに読み込んで、順にプリンターに出力します。

    Code Snippet

        Private Class PrintToPrinter
            Private streams As New System.Collections.Generic.Queue(Of System.IO.Stream)

            Public Sub Print(ByVal localReport As Microsoft.Reporting.WinForms.LocalReport, _
                             ByVal printdoc As System.Drawing.Printing.PrintDocument)
                Dim deviceInfo As String = "<DeviceInfo><OutputFormat>EMF</OutputFormat></DeviceInfo>"
                Dim warnings() As Microsoft.Reporting.WinForms.Warning = Nothing
                streams.Clear()
                localReport.Render("Image", deviceInfo, AddressOf GetStream, warnings)
                If streams.Count > 0 Then
                    AddHandler printdoc.PrintPage, AddressOf PrintPage
                    printdoc.Print()

                    RemoveHandler printdoc.PrintPage, AddressOf PrintPage
                End If
            End Sub

            Private Function GetStream(ByVal name As String, _
                                       ByVal fileNameExtension As String, _
                                       ByVal encoding As System.Text.Encoding, _
                                       ByVal mimeType As String, _
                                       ByVal willSeek As Boolean) As System.IO.Stream
                Dim ms As New System.IO.MemoryStream()
                streams.Enqueue(ms)
                Return ms
            End Function

            Private Sub PrintPage(ByVal sender As Object, ByVal ev As System.Drawing.Printing.PrintPageEventArgs)
                Using ms As System.IO.Stream = streams.Dequeue()
                    ms.Position = 0
                    Dim pageImage As New System.Drawing.Imaging.Metafile(ms)
                    ev.Graphics.DrawImage(pageImage, ev.PageBounds)
                    ms.Dispose()
                End Using
                ev.HasMorePages = (streams.Count > 0)
            End Sub
        End Class

      

    参考ページはMSDNにあります
    2008年10月8日 12:19
  • ご回答ありがとうございます。
    プログラムまで載せて頂き、大変参考になりました。

     

    MSDNのページも参考にして、
    思うように印刷することができました。

     

    たびたびありがとうございます。
    とても助かりました。

     

    2008年10月9日 1:28