CrystalReports Viewerの「メイン レポート」タブを任意の文字列にする

Crystal Reports
CrystalReports XI Release2VisualStudio2005と併用すると、VisualStudioのIDEに統合されて、非常に使い勝手のよい帳票ツールとなります。エディションによってはおまけバージョンのCrystalReportsがついてくるものもあるのですが、自分のエディションにはついていないので別途購入しました。
なお、Windowsアプリケーションなどに組み込む場合は、CrystalReports Developer版以上を購入しなければなりません。また、VisualStudioのIDE内で使うためにはRelease2にアップグレードするためのパッチ(無料)を当てなければ利用できないなどちょっとわかりにくい製品構成になっています。

 Crystal Reports Viewerのタブの文字がダサい
cr_origin1.jpgWindowsアプリケーションに埋め込みで作成した帳票は、CrystalReportViewerから見ると、レンダリングされたときViewer内に「メイン レポート」というタブが表示されます。レポート名とかが表示されたり、任意の文字列を指定できれば使い道も広がるのですが、「メイン レポート」しか出てこないのではちょっと使い道がありません。そこで、

  • 任意の文字列に変更ができないか?
  • 非表示にできないか?

を検討してみることにしました。 
まず、ご本家のFAQによると

  • Q.【開発】 .NETのビューアでプレビューを実行した時のビューア左上の [メイン レポート] のタブは非表示にできますか。
  • A.残念ですが、このタブを非表示にはできません。固定で表示する内部仕様となります。(2004/11/06)

ダメじゃん。サポート元でキッパリと言い切られています。
もちろん、CrystalReportViewerのプロパティー設定でも消すことはおろか、タブの文字列を設定することすらできません。

が、もう少しGoogle先生に働いてもらったところ、「クリスタルレポート技自慢」という掲示板で「No.2287」の質問

クリスタルレポートビューワーのタブの「メインレポート」という文字列は
変更できないのでしょうか?
ご存知でしたら、ご教授ください。

  というのがあり、その回答のひとつに

ちょっと無理やりですが、変更出来ますよ。
※Crystal Reports for Visual Studio .NET 2003で確認 

Dim objRepView As Object
Dim objControl As Object
    
For Each objRepView In CrystalReportViewer1.Controls
If objRepView.GetType.Name = "PageView" Then
For Each objControl In objRepView.Controls
If objControl.GetType.Name = "TabControl" Then
CType(objControl, TabControl).TabPages(0).Text = "変更したいタイトル"
End If
Next
End If
Next

というのがありました。コードで変更できるとわかれば問題ありません。

上記のコードをとりあえず、C#に書き換えてみます。が、VBとちがって、C#はクラス名とか厳密に記述しないといけなかったりするので・・・えーっと、VBの「CType」ってキャストのことか・・・とかいろいろVBを思い出しながら書き換え、「論よりRun」します。

動きません・・・orz。

まあ、安易に人に頼ってはいけないと思い直し、ちゃんと細かく調査をしながらやり直します。

  1.  private void setTabText(CrystalDecisions.Windows.Forms.CrystalReportViewer crystalReportViewer, string newText)
  2.  {
  3.     foreach (Control control in crystalReportViewer.Controls)
  4.      if (control is CrystalDecisions.Windows.Forms.PageView)
  5.       foreach (Control controlInViewer in control.Controls)
  6.        if (controlInViewer is TabControl)
  7.         foreach (TabPage tabPage in (controlInViewer as TabControl).TabPages)
  8.          if (tabPage.Text == "メイン レポート")
  9.          {
  10.            tabPage.Text = newText;
  11.            return;
  12.          }
  13.  } 

 

試行錯誤すること数回、上記コードで目的を達することができました。

使用上の留意点
上記を呼び出すタイミングは、CrystalReportsViewerが、貼り付けられたフォーム上に生成(表示)されてからでなければなりません。
よって、コンストラクタとかフォームのロードイベントなどに記述しても動きません。
shownイベントなどに書くのがいいかと。

  1.  private void frmPrint_Shown(object sender, EventArgs e)
  2.          {
  3.             setTabText(crystalReportViewer, "Chameleon Cyber Cracked!");
  4.          }

実行画面CrystalReportTabText_changed
このようにタブの文字列が任意の文字列に変更されています。
この動作は、以下の環境で実現しました。

  • 開発環境:VisualStudio 2005 .NET
  • 開発言語:C#
  • 帳票ソフト:Crystal Reports XI Release 2
  • OS:WindowsXP SP2

 

Leave a Reply

XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>