Windowsフォームアプリでレポートを印刷する際、印刷処理の終了を判断する方法は?

文書番号 : 33931     文書種別 : 使用方法     登録日 : 2012/11/21     最終更新日 : 2014/09/04
文書を印刷する
対象製品
ActiveReports for .NET 7.0J
詳細
※注意
Service Pack 2(v7.2.8529.1)を適用している場合は、本ナレッジ文書で紹介しているサンプルコードが正常に動作しません。詳細は以下のナレッジ文書をご覧ください。

SP2を適用すると、GrapeCity.ActiveReports.Document.SectionDocument.Printerクラスに属する一部のイベントが発生しなくなる



印刷処理の完了を判断する方法としては、.NET FrameworkのSystem.Drawing.Printing.PrintDocumentクラスから継承される、PageDocumentまたはSectionDocumentクラスのPrinterプロパティのEndPrintイベントを利用する方法が考えられます。

なお、EndPrintイベントを使用するには、下記のサンプルコードのように、イベントハンドラを関連付ける必要があります。

◆サンプルコード(VB.NET)
【ページレポートの場合】
Private Sub Form1_Load(...) Handles MyBase.Load
  ' ページレポートをViewerに表示します。
  Dim file_name As String = "..¥..¥PageReport1.rdlx"
  Dim pageReport As New GrapeCity.ActiveReports.PageReport(New System.IO.FileInfo(file_name))
  Dim pageDocument As New GrapeCity.ActiveReports.Document.PageDocument(pageReport)
  Me.Viewer1.LoadDocument(pageDocument)

  ' EndPrintイベントをイベントハンドラに関連付けます。
  AddHandler pageDocument.Printer.EndPrint, AddressOf Me.onEndPrint

End Sub

' イベントハンドラ
Private Sub onEndPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs)
  Console.WriteLine("印刷完了")
End Sub

【セクションレポートの場合】
Private Sub Form1_Load(...) Handles MyBase.Load
  ' セクションレポートをViewerに表示します。
  Dim sectionReport As New SectionReport1
  sectionReport.Run()
  Dim sectionDocument As GrapeCity.ActiveReports.Document.SectionDocument
  sectionDocument = sectionReport.Document
  Me.Viewer1.LoadDocument(sectionDocument)

  ' EndPrintイベントをイベントハンドラに関連付けます。
  AddHandler sectionDocument.Printer.EndPrint, AddressOf Me.onEndPrint

End Sub

' イベントハンドラ
Private Sub onEndPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs)
  Console.WriteLine("印刷完了")
End Sub

◆サンプルコード(C#)
【ページレポートの場合】
private void Form1_Load(object sender, EventArgs e)
{
  // ページレポートをViewerに表示します。
  string file_name = @"..¥..¥PageReport1.rdlx";
  GrapeCity.ActiveReports.PageReport pageReport
    = new GrapeCity.ActiveReports.PageReport(new System.IO.FileInfo(file_name));
  GrapeCity.ActiveReports.Document.PageDocument pageDocument
    = new GrapeCity.ActiveReports.Document.PageDocument(pageReport);
  this.viewer1.LoadDocument(pageDocument);

  // EndPrintイベントをイベントハンドラに関連付けます。
  pageDocument.Printer.EndPrint += new System.Drawing.Printing.PrintEventHandler(onEndPrint);

}

// イベントハンドラ
private void onEndPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
  Console.WriteLine("印刷完了");
}

【セクションレポートの場合】
private void Form1_Load(object sender, EventArgs e)
{
  // セクションレポートをViewerに表示します。
  SectionReport1 sectionReport = new SectionReport1();
  sectionReport.Run();
  GrapeCity.ActiveReports.Document.SectionDocument sectionDocument _
    = sectionReport.Document;
  this.viewer1.LoadDocument(sectionDocument);

  // EndPrintイベントをイベントハンドラに関連付けます。
  sectionDocument.Printer.EndPrint += new System.Drawing.Printing.PrintEventHandler(onEndPrint);
}

// イベントハンドラ
private void onEndPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
  Console.WriteLine("印刷完了");
}


なお、上記のような処理で、「ActiveReports側の印刷処理が完了したかどうか」を判断できますが、これは「ActiveReportsから(プリンタスプーラなどへの)印刷データの出力が完了したかどうか」という判断です。

実際に「プリンタ側で印刷が行われたかどうか」(プリンタ側での印刷完了やエラー)を判断する機能は、ActiveReportsには用意されておりません。
関連情報
キーワード
HowTo 印刷・プレビュー