Windowsフォームアプリでレポートを印刷する際、印刷処理の終了を判断する方法は?
対象製品
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)
◆サンプルコード(C#)
なお、上記のような処理で、「ActiveReports側の印刷処理が完了したかどうか」を判断できますが、これは「ActiveReportsから(プリンタスプーラなどへの)印刷データの出力が完了したかどうか」という判断です。
実際に「プリンタ側で印刷が行われたかどうか」(プリンタ側での印刷完了やエラー)を判断する機能は、ActiveReportsには用意されておりません。
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 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
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に表示します。
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("印刷完了");
}
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には用意されておりません。
関連情報
- Windowsフォームアプリケーションでプレビュー表示せずにレポートを直接印刷する方法は?
- Windowsフォームアプリでレポートを印刷する際、印刷ダイアログ上で押されたボタンを判断する方法は?
- Viewerコントロールの[印刷]ボタンを押下したときに、印刷ダイアログを表示せず、直接印刷を行う方法は?
キーワード
HowTo 印刷・プレビュー