Windowsフォームアプリでレポートを印刷する際、印刷ダイアログ上で押されたボタンを判断する方法は?
対象製品
ActiveReports for .NET 7.0J
詳細
Windowsフォームアプリケーション用のViewerコントロール上の[印刷]ボタンや Printメソッドなどでレポートを印刷する際に、印刷設定ダイアログ上で[OK]ボタンが押されたかキャンセルされたかを判断するには、以下のような方法があります。
なお、上記のような処理で「印刷設定ダイアログ上でOKボタンが押されたかどうか」を判断することはできますが、実際に「プリンタ側で印刷が行われたかどうか(プリンタ側で正しく用紙に印刷されたかどうか、デバイスエラー等が発生していないかどうか)」を判断することはできません。
また、そうした動作を実現する機能・方法は、ActiveReports には用意されておりません。
- Printメソッドの戻り値を利用する方法
Printメソッドの第1引数を"True"に設定して実行すると、印刷設定ダイアログが表示されます。
この時 Printメソッドは、[OK]と[キャンセル]のどちらのボタンが押されたのかを戻り値として返します。
[OK]ボタンの場合は"True"が、[キャンセル]ボタンの場合は"False"が返されます。
たとえば、Viewerコントロール標準の[印刷]ボタンに適用する場合、こちらの文書で公開しているサンプルコードの「PrintButtonClick」の部分を以下のように変更します。
◆サンプルコード(VB.NET)
Private Sub PrintButtonClick(ByVal sender As Object, ByVal e As System.EventArgs)
' カスタムボタンがクリックされたら、印刷処理を行います。
Dim blnprint As Boolean = Me.Viewer1.Print(True, True, False)
If blnprint Then
MessageBox.Show("「OK」ボタンがクリックされました。")
Else
MessageBox.Show("「キャンセル」ボタンがクリックされました。")
End If
End Sub
◆サンプルコード(C#)
private void PrintButtonClick(System.Object sender, System.EventArgs e)
{
// カスタムボタンがクリックされたら、印刷処理を行います。
bool blnprint = this.viewer1.Print(true, true, false);
if (blnprint)
{
MessageBox.Show("「OK」ボタンがクリックされました。");
}
else
{
MessageBox.Show("「キャンセル」ボタンがクリックされました。");
}
} - .NET標準の印刷設定ダイアログ(System.Windows.Forms.PrintDialog)を使用する方法
.NET Framework標準の印刷設定ダイアログ(System.Windows.Forms.PrintDialog)を ShowDialogメソッドで呼び出した場合、その戻り値から押されたボタンを判定することが可能です。
PrintDialog クラス (System.Windows.Forms)
たとえば、Viewerコントロール標準の[印刷]ボタンに適用する場合、上記「1.」と同様に、Viewerコントロールのツールバーをカスタマイズします。以下のコードのようになります。
◆サンプルコード(VB.NET)
Imports GrapeCity.ActiveReports
………………
Private tsbPrint As New System.Windows.Forms.ToolStripButton ' カスタムボタン
Private WithEvents pd As New System.Windows.Forms.PrintDialog ' 印刷設定ダイアログ
Private WithEvents myTimer As New System.Windows.Forms.Timer ' タイマー
'' *** ページレポートの場合のみ ***
'Private pageDocument As GrapeCity.ActiveReports.Document.PageDocument
'※イベントの引数は省略しております。
Private Sub Form1_Load(...) Handles MyBase.Load
' イメージ取得のために標準の印刷ボタンを取得します。
Dim orgBtn As System.Windows.Forms.ToolStripButton _
= DirectCast(Me.Viewer1.Toolbar.ToolStrip.Items(2), ToolStripButton)
' カスタムボタンのイメージを設定します。
tsbPrint.Text = orgBtn.Text
tsbPrint.ToolTipText = orgBtn.ToolTipText
tsbPrint.Image = orgBtn.Image
tsbPrint.Enabled = False
' イベントハンドラを設定します。
AddHandler tsbPrint.Click, AddressOf Me.PrintButtonClick ' カスタムボタン
AddHandler myTimer.Tick, AddressOf Me.myTimer_Tick ' タイマー
' 標準の印刷ボタンを削除します。
Me.Viewer1.Toolbar.ToolStrip.Items.RemoveAt(2)
' カスタムボタンをツールバーに追加します。
Me.Viewer1.Toolbar.ToolStrip.Items.Insert(2, tsbPrint)
' ***** セクションレポートの場合 **********************************************
Dim rpt As New SectionReport1
' 印刷設定ダイアログにセクションレポートのプリンタ情報を設定します。
pd.UseEXDialog = True
pd.Document = rpt.Document.Printer
' セクションレポートをビューワに設定します。
rpt.Run(False)
Me.Viewer1.Document = rpt.Document
'' ***** ページレポートの場合 *************************************************
'Dim file_name As String = "PageReport1.rdlx"
'Dim pageReport As New _
' GrapeCity.ActiveReports.PageReport(New System.IO.FileInfo(file_name))
'pageDocument = New GrapeCity.ActiveReports.Document.PageDocument(pageReport)
'' 印刷設定ダイアログにページレポートのプリンタ情報を設定します。
'pd.UseEXDialog = True
'pd.Document = pageDocument.Printer
'' ページレポートをビューワに設定します。
'Me.Viewer1.LoadDocument(pageDocument)
End Sub
' Viewerにレポートがロードされた時に呼び出されるイベント。
'※イベントの引数は省略しております。
Private Sub Viewer1_LoadCompleted(...) Handles Viewer1.LoadCompleted
' カスタムボタンを有効にします。
tsbPrint.Enabled = True
' 印刷設定ダイアログの設定を生成されたレポートの内容で更新します。
pd.AllowSomePages = True
pd.PrinterSettings.FromPage = 1
pd.PrinterSettings.ToPage = Integer.Parse _
(Me.Viewer1.Toolbar.ToolStrip.Items(21).Text.Replace("+", "").Replace("1/", ""))
End Sub
' カスタムボタンクリック時に呼び出されるイベント。
Private Sub PrintButtonClick(ByVal sender As Object, ByVal e As System.EventArgs)
' タイマーを開始します。
myTimer.Start()
End Sub
' タイマーが経過した時に呼び出されるイベント。
Private Sub myTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs)
' タイマーを停止し、印刷設定ダイアログを表示します。
myTimer.Stop()
If (pd.ShowDialog() = DialogResult.OK) Then
' [OK]ボタンがクリックされたら、Printメソッドを実行します。
' *** セクションレポートの場合 ***
Me.Viewer1.Print(False, True, False)
'' *** ページレポートの場合 ***
'pageDocument.Print(False, True, False)
MessageBox.Show("「OK」ボタンがクリックされました。")
Else
MessageBox.Show("「キャンセル」ボタンがクリックされました。")
End If
End Sub
◆サンプルコード(C#)
using GrapeCity.ActiveReports;
………………
private ToolStripButton tsbPrint = new System.Windows.Forms.ToolStripButton(); // カスタムボタン
private PrintDialog pd = new System.Windows.Forms.PrintDialog(); // 印刷設定ダイアログ
private Timer myTimer = new System.Windows.Forms.Timer(); // タイマー
//// *** ページレポートの場合のみ ***
//private GrapeCity.ActiveReports.Document.PageDocument pageDocument;
private void Form1_Load(object sender, EventArgs e)
{
// イメージ取得のために標準の印刷ボタンを取得します。
System.Windows.Forms.ToolStripButton orgBtn
= (System.Windows.Forms.ToolStripButton)this.viewer1.Toolbar.ToolStrip.Items[2];
// カスタムボタンのイメージを設定します。
tsbPrint.Text = orgBtn.Text;
tsbPrint.ToolTipText = orgBtn.ToolTipText;
tsbPrint.Image = orgBtn.Image;
tsbPrint.Enabled = false;
// イベントハンドラを設定します。
tsbPrint.Click += new EventHandler(PrintButtonClick); // カスタム印刷ボタン
myTimer.Tick += new EventHandler(myTimer_Tick); // タイマー
this.viewer1.LoadCompleted += new
GrapeCity.ActiveReports.Document.LoadCompletedEventHandler(viewer1_LoadCompleted);
// 標準の印刷ボタンを削除します。
this.viewer1.Toolbar.ToolStrip.Items.RemoveAt(2);
// カスタムボタンをツールバーに追加します。
this.viewer1.Toolbar.ToolStrip.Items.Insert(2, tsbPrint);
// ***** セクションレポートの場合 **********************************************
SectionReport1 rpt = new SectionReport1();
// 印刷設定ダイアログにセクションレポートのプリンタ情報を設定します。
pd.UseEXDialog = true;
pd.Document = rpt.Document.Printer;
// セクションレポートをビューワに設定します。
rpt.Run(false);
this.viewer1.Document = rpt.Document;
//// ***** ページレポートの場合 ***********************************************
//string file_name = "PageReport1.rdlx";
//GrapeCity.ActiveReports.PageReport pageReport
// = new GrapeCity.ActiveReports.PageReport(new System.IO.FileInfo(file_name));
//pageDocument = new GrapeCity.ActiveReports.Document.PageDocument(pageReport);
//// 印刷設定ダイアログにページレポートのプリンタ情報を設定します。
//pd.UseEXDialog = true;
//pd.Document = pageDocument.Printer;
//// ページレポートをビューワに設定します。
//this.viewer1.LoadDocument(pageDocument);
}
// Viewerにレポートがロードされた時に呼び出されるイベント。
private void viewer1_LoadCompleted(object sender, EventArgs e)
{
// カスタムボタンを有効にします。
tsbPrint.Enabled = true;
// 印刷設定ダイアログの設定を生成されたレポートの内容で更新します。
pd.AllowSomePages = true;
pd.PrinterSettings.FromPage = 1;
pd.PrinterSettings.ToPage = int.Parse
(this.viewer1.Toolbar.ToolStrip.Items[21].Text.Replace("+", "").Replace("1/", ""));
}
// カスタムボタンクリック時に呼び出されるイベント。
private void PrintButtonClick(System.Object sender, System.EventArgs e)
{
// タイマーを開始します。
myTimer.Start();
}
// タイマーが経過した時に呼び出されるイベント。
private void myTimer_Tick(Object myObject, EventArgs myEventArgs)
{
// タイマーを停止し、印刷設定ダイアログを表示します。
myTimer.Stop();
if (pd.ShowDialog() == DialogResult.OK)
{
// [OK]ボタンがクリックされたら、Printメソッドを実行します。
// *** セクションレポートの場合 ***
this.viewer1.Print(false, true, false);
//// *** ページレポートの場合 ***
//pageDocument.Print(false, true, false)
MessageBox.Show("「OK」ボタンがクリックされました。");
}
else
{
MessageBox.Show("「キャンセル」ボタンがクリックされました。");
}
}
なお、この方法の場合、印刷時には.NET標準のPrintDialogが表示されるため、製品ヘルプの以下のトピックで説明している、ActiveReports独自機能である[ページ設定]ダイアログは利用できません。
PowerTools ActiveReports for .NET 7.0J
- ActiveReportsユーザーガイド
- 基本操作
- 印刷の詳細設定
なお、上記のような処理で「印刷設定ダイアログ上でOKボタンが押されたかどうか」を判断することはできますが、実際に「プリンタ側で印刷が行われたかどうか(プリンタ側で正しく用紙に印刷されたかどうか、デバイスエラー等が発生していないかどうか)」を判断することはできません。
また、そうした動作を実現する機能・方法は、ActiveReports には用意されておりません。
関連情報
- Windowsフォームアプリでレポートを印刷する際、印刷処理の終了を判断する方法は?
- Viewerコントロールの[印刷]ボタンを押下したときに、印刷ダイアログを表示せず、直接印刷を行う方法は?
- Viewerコントロールのツールバーをカスタマイズする方法は?
- Windowsフォームアプリケーションでプレビュー表示せずにレポートを直接印刷する方法は?
キーワード
HowTo 印刷・プレビュー セクションレポート ページレポート