GrapeCity ActiveReports for .NET 14.0J
印刷
ActiveReportsユーザーガイド > よくある質問 > 共通の項目(ページレポート/RDLレポート/セクションレポート) > 印刷

印刷状況ダイアログの表示位置を指定する

印刷状況(進行状況)ダイアログの表示位置を指定することはできません。

Viewerコントロール上の[印刷]ボタンや、Printメソッドなどでレポートを印刷する際、印刷状況ダイアログ(PrintProgressDialog)が表示されます。

ActiveReportsでは、印刷状況ダイアログは常に画面中央に表示される仕様となっており、表示位置を指定するための機能や設定は特に用意されていません。

Viewerコントロールの[印刷]ボタンを押下したときに、印刷ダイアログを表示せず、直接印刷を行う

Viewerコントロール標準の印刷ボタンを使用してレポートを印刷する場合、必ず印刷設定ダイアログが表示されます。このダイアログを非表示にするプロパティなどは、特に用意致しておりません。

このような動作を実現する方法としては、Viewerコントロールのツールバーをカスタマイズして、独自に追加した印刷ボタンから、Printメソッドを実行して印刷処理を行う方法が考えられます。 Printメソッドの第1引数を"False"に設定すると、印刷設定ダイアログを表示せずにレポートを印刷します。

Viewerコントロール標準の[印刷]ボタンをカスタマイズする方法は、こちらの文書で公開いたしております。 上記文書内のサンプルコードの「PrintButtonClick」の部分を以下のように変更してください。

Visual Basic

Visual Basicコード
コードのコピー
   Private Sub PrintButtonClick(ByVal sender As Object, ByVal e As System.EventArgs)
   ' 印刷設定ダイアログを表示せずに、印刷処理を実行します。
   Me.Viewer1.Print(False, True, False)
 End Sub                                             

C#

C#コード
コードのコピー
 private void PrintButtonClick(System.Object sender, System.EventArgs e)
 {
   // 印刷設定ダイアログを表示せずに、印刷処理を実行します。
   this.viewer1.Print(false, true, false);
 }

Windowsフォームアプリケーションでプレビュー表示せずにレポートを直接印刷する

Windowsフォームアプリケーションの場合、Printメソッドを使用することで、プレビューすることなく、直接レポートを印刷することが可能です。

セクションレポートの場合はSectionDocumentクラスのPrintメソッドを、ページレポート/RDLレポートの場合は PageDocumentクラスのPrintメソッドを使用します。

詳細な方法については、製品ヘルプの「ActiveReportsでのPrintメソッド」のトピックにある「SectionDocumentまたはPageDocumentから、Printメソッドを使用する」の項を参照してください。

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

Windowsフォームアプリケーション用のViewerコントロール上の[印刷]ボタンや Printメソッドなどでレポートを印刷する際に、印刷設定ダイアログ上で[OK]ボタンが押されたかキャンセルされたかを判断するには、以下のような方法があります。

  1. Printメソッドの戻り値を利用する方法

    Printメソッドの第1引数を"True"に設定して実行すると、印刷設定ダイアログが表示されます。

    この時 Printメソッドは、[OK]と[キャンセル]のどちらのボタンが押されたのかを戻り値として返します。
    [OK]ボタンの場合は"True"が、[キャンセル]ボタンの場合は"False"が返されます。

    たとえば、Viewerコントロール標準の[印刷]ボタンに適用する場合、こちらの文書で公開しているサンプルコードの「PrintButtonClick」の部分を以下のように変更します。

     

    Visual Basic

    Visual Basicコード
    コードのコピー
    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#

    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コントロールのツールバーをカスタマイズします。以下のコードのようになります。

    Visual Basic

    Visual Basicコード
    コードのコピー
    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 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))
        'Dim pageDocument As 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)
    
            MessageBox.Show("「OK」ボタンがクリックされました。")
        Else
            MessageBox.Show("「キャンセル」ボタンがクリックされました。")
        End If
    End Sub
                                                                    
    

    C#

    C#コード
    コードのコピー
    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 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.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));
      //GrapeCity.ActiveReports.Document.PageDocument 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);
        MessageBox.Show("「OK」ボタンがクリックされました。");
      }
      else
      {
        MessageBox.Show("「キャンセル」ボタンがクリックされました。");
      }
    }
    

なお、上記のような処理で「印刷設定ダイアログ上でOKボタンが押されたかどうか」を判断することはできますが、実際に「プリンタ側で印刷が行われたかどうか(プリンタ側で正しく用紙に印刷されたかどうか、デバイスエラー等が発生していないかどうか)」を判断することはできません。

また、そうした動作を実現する機能・方法は、ActiveReports には用意されておりません。

印刷時のドキュメント名を指定する

Viewerコントロールの[印刷]ボタンやPrintメソッドで印刷する時のドキュメント名は、PrinterクラスのDocumentNameプロパティによって設定できます。

また、セクションレポートの場合は、SectionDocumentクラスのNameプロパティでも設定できます。

 

具体的なコードは、レポートの形式によって異なります。以下の内容をご覧ください。

セクションレポートの場合

Visual Basic(PrinterクラスのDocumentNameプロパティ)

Visual Basicコード
コードのコピー
Private Sub Form1_Load(...) Handles MyBase.Load
    Dim rpt As New SectionReport1

    ' 印刷時のドキュメント名を設定します。
    rpt.Document.Printer.DocumentName = "文書1"
    
    ' レポートを実行し、プレビューします。
    rpt.Run(False)
    Me.Viewer1.Document = rpt.Document
End Sub

Visual Basic(SectionDocumentクラスのNameプロパティ)

Visual Basicコード
コードのコピー
Private Sub btnPrint_Click(...) Handles btnPrint.Click
    ' 印刷時のドキュメント名を設定します。
    Me.Viewer1.Document.Name = "文書1"
    Me.Viewer1.Print(True, True, True)
End Sub

C#(PrinterクラスのDocumentNameプロパティ)

C#コード
コードのコピー
private void Form1_Load(object sender, System.EventArgs e)
{
    SectionReport1 rpt = new SectionReport1();

    // 印刷時のドキュメント名を設定します。
    rpt.Document.Printer.DocumentName = "文書1";

    // レポートを実行し、プレビューします。
    rpt.Run(false);
    this.viewer1.Document = rpt.Document;
}                               

C#(SectionDocumentクラスのNameプロパティ)

C#コード
コードのコピー
private void btnPrint_Click(object sender, System.EventArgs e)
{
    // 印刷時のドキュメント名を設定します。
    this.viewer1.Document.Name = "文書1";
    this.viewer1.Print(true, true, true);
}                               

ページレポート/RDLレポートの場合

Visual Basic(PrinterクラスのDocumentNameプロパティ)

Visual Basicコード
コードのコピー

Private Sub Form1_Load(...) Handles MyBase.Load
  Dim rpt As New GrapeCity.ActiveReports.PageReport()
  rpt.Load(New System.IO.FileInfo("PageReport1.rdlx"))
  Dim MyDocument As New GrapeCity.ActiveReports.Document.PageDocument(rpt)

   ' 印刷時のドキュメント名を設定します。
  MyDocument.Printer.DocumentName = "文書1"

   ' レポートを実行し、プレビューします。
  Me.Viewer1.LoadDocument(MyDocument)
End Sub

C#(PrinterクラスのDocumentNameプロパティ)

C#コード
コードのコピー

private void Form1_Load(object sender, System.EventArgs e)
{
  GrapeCity.ActiveReports.PageReport rpt = new GrapeCity.ActiveReports.PageReport();
  rpt.Load(new System.IO.FileInfo("PageReport1.rdlx"));
  GrapeCity.ActiveReports.Document.PageDocument MyDocument
    = new GrapeCity.ActiveReports.Document.PageDocument(rpt);

   // 印刷時のドキュメント名を設定します。
  MyDocument.Printer.DocumentName = "文章1";

   // レポートを実行し、プレビューします。
  this.viewer1.LoadDocument(MyDocument);
}

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

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

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

セクションレポートの場合

Visual Basic

Visual Basicコード
コードのコピー

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#

C#コード
コードのコピー

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("印刷完了");
}

ページレポート/RDLレポートの場合

Visual Basic

Visual Basicコード
コードのコピー
                       
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

C#

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("印刷完了");
}
                                                
関連トピック