Windowsフォームアプリでレポートを印刷する際、印刷ダイアログ上で押されたボタンを判断する方法は?

文書番号 : 33930     文書種別 : 使用方法     登録日 : 2012/12/19     最終更新日 : 2013/07/31
文書を印刷する
対象製品
ActiveReports for .NET 7.0J
詳細
Windowsフォームアプリケーション用のViewerコントロール上の[印刷]ボタンや Printメソッドなどでレポートを印刷する際に、印刷設定ダイアログ上で[OK]ボタンが押されたかキャンセルされたかを判断するには、以下のような方法があります。

  1. 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("「キャンセル」ボタンがクリックされました。");
      }
    }

  2. .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 には用意されておりません。
関連情報
キーワード
HowTo 印刷・プレビュー セクションレポート ページレポート