はじめに
前回に引き続き、PowerTools True WinReports for .NETのC1Reportコンポーネントを使ってAccessのデータから帳票を作成するアプリケーションを作ります。
今回は、コードからレポートのヘッダーを操作し、抽出結果ごとにレポートタイトルの背景色や説明文の追加などを行えるようにします。
過去の記事
対象読者
Visual Basic 2005またはVisual C# 2005を使ってプログラムを作ったことのある人。
必要な環境
Visual Basic 2005またはVisual C# 2005、Visual Studio 2005でプログラムが作れる環境。
プログラム実行時の注意事項
本稿の実行ファイル(バイナリファイル)を動かすには、zipファイルに同梱してある以下の3つのファイルが必要になります。
- C1.C1Preview.2.dll…C1PrintDocumentコントロール(.NET Framework 2.0用)
- C1.Win.C1Preview.2.dll…C1PrintPreviewコントロール(.NET Framework 2.0用)
- C1.Win.C1Report.2.dll…C1Reportコントロール(.NET Framework 2.0用)
これらのファイルを、実行プログラムと同じフォルダに格納します。なお、.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。
また、サンプルデータベース「guiter.mdb」をドライブCのルートにおいてください。
コンポーネントのインストール
はじめてPowerTools True WinReports for .NETおよびPowerTools Preview for .NETを使用する方は、プロジェクトにComponentOne Studio 2007 WinForms Editionをインストールする必要があります。インストーラは、グレープシティのWebページからダウンロードできますので、ここからダウンロードしてインストールしてください。
製品ページ左側の[ダウンロード]-[トライアル版]をクリックし、ダウンロード方法([FTP]または[HTTP])を選択すれば入手できます。ファイルはLZH形式で圧縮されています。
有償のコンポーネントですが、プロダクトキーを入力せずにインストールすることで、トライアル版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールの追加
ComponentOne Studio 2007 WinForms Editionをインストールしたら、ツールボックスに専用のタブを作成し、PowerTools True WinReports for .NETおよびPowerTools Preview for .NETを追加します。追加するコンポーネントは、「.NET Frameworkコンポーネント」の「名前空間」が「C1.Win.C1Preview」で始まる名前空間のコンポーネント「C1PrintPreviewControl」と、「C1.Win.C1Report」で始まる「C1Report」です。
GUIの作成
今回は、GUIの作成・修正はありません。前回作成したプログラムに手を加えて、機能を拡張していきます。
Fieldオブジェクトの働き
このプログラムでは、パラメータクエリを実行した結果をレポートにする際に、メーカー名によってレポートのヘッダーの背景色と文字色を変えるようにします。これは、ヘッダーの部分に「Fields」というオブジェクト(Labelのようなオブジェクト)を組み込み、そこに文字列の設定や背景色の設定を行います。
このFieldはレポート内にいくつも組み込むことができ、表示位置の指定や重なりの順序を指定できます。
そこで、ヘッダー部にそれぞれのメーカーの簡単な説明文を表示するようにします。説明文はコード内に記述しそれを呼び出します。
タイトルの作成
最初にレポートのタイトルを作成します。
前回作成した「抽出実行」ボタンのClickイベントハンドラの、RecordSourceプロパティにSQL文字列を代入したコードの、次の行にコードを組み込んでいきます。
説明文の作成
まず、メーカー説明用の文章(ここでは便宜上説明文は3つだけにしました)を作り、配列に格納しておきます。
Dim exp(2) As String exp(0) = "アメリカの老舗ギターブランド...愛されてきました。" exp(1) = "日本を代表するギターメーカー...揃っています。" exp(2) = "ポールリードスミスは、Gibson、...なりました。"
String[] exp = new String[3]; exp[0] = "アメリカの老舗ギターブランド...愛されてきました。"; exp[1] = "日本を代表するギターメーカー...揃っています。"; exp[2] = "ポールリードスミスは、Gibson、...なりました。";
古いタイトル用Fieldの削除
新しいタイトル用Fieldオブジェクトをメーカー名を付けて作成します。
レポートには、既に「製品情報」というFieldが組み込まれています。これは、C1Reportコンポーネントのレポートデザイナでレポートを作成したときに既に組み込まれています。
そこで、まずこのFieldを削除し、次にメーカー名付きの新しいタイトルを組み込みます。
削除はデザイナで行っても構いませんが、このプログラムではパラメータクエリを実行するたびにタイトルを作り直しますので、コードで削除します。タイトル用のFieldは、C1Reportコンポーネントの、Sectionオブジェクトの下にあります。このオブジェクトは、Sectionsコレクションになっているので、Sectionsプロパティの引数に「SectionTypeEnum.Header」を指定することで、ヘッダー部にあるFieldsコレクションを参照できるようになります。
Fieldの削除は、FieldsコレクションのRemoveメソッドを実行します。引数は、Fieldオブジェクトのインデックス番号またはオブジェクト名です。ヘッダー部のFieldオブジェクトは、この時点では1つしかありませんから、「0」を指定してRemoveメソッドを実行します。
なお、C#ではSectionオブジェクトを一度オブジェクト変数に格納し、そこからFieldsプロパティにアクセスします。
Dim f As Field With Me.C1Report1.Sections(SectionTypeEnum.Header) .Fields.Remove(0)
Field f ; Section s; s = c1Report1.Sections[SectionTypeEnum.Header]; s.Fields.Remove(0);
新しいタイトル用Fieldの作成
次に、新しいタイトル用Fieldを作成します。これは、FieldsコレクションのAddメソッドを実行します。引数は、オブジェクト名、表示する文字列、表示位置、サイズの6つです。表示する文字は、「製品情報 - 」とComboBoxで選択されたメーカー名を組み合わせます。
表示位置は、Fieldを配置する左端と上端の位置で、TWIP単位で指定します。サイズはFieldの幅と高さで、これもTWIP単位で指定します。
作成したら、AddメソッドはFieldオブジェクトへの参照を返してきますので、これをオブジェクト変数に格納し、文字のサイズ、太字、文字色を設定します。
f = .Fields.Add("title", "製品情報 - " & _ Me.ComboBox1.SelectedItem, 100, 100, 8000, 1500) f.Font.Size = 24 f.Font.Bold = True f.ForeColor = Color.Beige
f = s.Fields.Add("title", "製品情報 - " + ComboBox1.SelectedItem, 100, 100, 8000, 1500); f.Font.Size = 24; f.Font.Bold = true; f.ForeColor = Color.Beige;
説明用のFieldオブジェクトの削除
既に説明用のFieldオブジェクトがあれば、これを削除します。
もし、古い説明文が残っていたままだと、その上に新しいFieldが重なってしまいます。Fieldはデフォルトでは背景色が透明で文字だけが表示されるようになっているので、2つの文章が重なって表示されてしまうため、古い説明文のFieldを削除します。
ただし、初めてプログラムを実行したときは、古い説明文のFieldはありませんから、FieldsコレクションのCountプロパティでFieldsオブジェクトの数をチェックしてから実行します。
If .Fields.Count >= 2 Then .Fields.Remove("exp") End If
if(s.Fields.Count >= 2){ s.Fields.Remove("exp"); }
これで、パラメータクエリを実行するたびに、選択されたメーカー名のついたタイトルが作成され表示されるようになります。
説明用Fieldの作成
今度は、メーカの説明文を表示するFieldを作成し、タイトル用Fieldの上に重ねて配置します(なお、ここでは便宜上3つだけ作成します)。
この処理は、ComboBoxで選択されたメーカー名で処理を分岐するようにします。
Fieldの追加
まず、タイトル用Fieldの高さと背景色を変更します。
そして、タイトル用Fieldと同じようにFieldsコレクションのAddメソッドを実行します。引数の文字列は配列から取得します。
Select Case Me.ComboBox1.SelectedIndex Case 0 With Me.C1Report1.Sections(SectionTypeEnum.Header) .Height = 1000 .Visible = True .BackColor = Color.BlueViolet f = .Fields.Add("exp", exp(0), 100, 800, 8000, 1500) f.Font.Size = 12 f.ForeColor = Color.Gold End With
switch(ComboBox1.SelectedIndex){ case 0: s.Height = 1000; s.Visible = true; s.BackColor = Color.BlueViolet; f = s.Fields.Add("exp", exp[0], 100, 800, 8000, 1500); f.Font.Size = 12; f.ForeColor = Color.Gold; break;
これで、1つ目のメーカー説明文が出来上がりました。同じようなコードを、他のメーカー分作成します。
タイトル文字の色を入れ替える
なお、case 2とcase 3では、見栄えをよくするためだけですが、タイトルの文字色を入れ替えておきます。
既に作成したFieldオブジェクトを参照するには、インデックス番号以外に、Addメソッドで付けたオブジェクト名を使って参照することもできます。
タイトル用Fieldは、Addメソッドで「title」という名前をつけているので、これを使って参照します。
.Fields("title").ForeColor = Color.Blue
s.Fields["title"].ForeColor = Color.LimeGreen;
これで、3種類のタイトルが出来上がります。
まとめ
クエリの結果によってレポートの形式を切り替えることができるようになると、アプリケーションの魅力もぐっとアップします。
今回は、説明文はコードの中に埋め込みましたが、説明文をデータベースやテキストファイルに格納しそこから取り出せるようにすれば、もっと便利な機能になります。
ヘッダーを例にコードの説明をしましたが、Fieldはレポート内のいろいろなところに組み込め、それぞれセクションごとに分けて操作できるので、プログラム実行時にいろいろなレポートが作成できるようになります。今回は、Fieldを作り直して入れ替えるようにしましたが、すでにあるFieldのプロパティを操作してコンテンツを入れ替えるようにすることもできます。
このFieldをうまく使うと、見栄えの良いレポートを作り出すことができます。
コード全文
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sqlstr As String sqlstr = "SELECT 製品一覧.メーカー, 製品一覧.製品名, " & _ "製品一覧.カラー FROM(製品一覧)" & _ " WHERE ((製品一覧.メーカー)='" & Me.ComboBox1.Text & "');" Me.C1Report1.DataSource.RecordSource = sqlstr 'メーカーごとの説明文を作成-ここでは便宜上3つだけ作成 Dim exp(2) As String exp(0) = "アメリカの老舗ギターブランド。エレキギターでは、" & _ "レスポール、SG、アコースティックギターではハミング" & _ "バード、ホロウ・ボディではES-335が代表的なギター。" & _ "レスポールは、レッドツエッペリンのジミーペイジ、B'sの" & _ "松本など数多くのプレーヤーに愛されてきました。" exp(1) = "日本を代表するギターメーカー。布袋寅泰やX-Japanの" & _ "故Hide、L'Arc~en~Cielのkenなど、国内トップアー" & _ "ティストが使用しているブランド。入門者用からプロフェッ" & _ "ショナル用まで幅広いラインアップが揃っています。" exp(2) = "ポールリードスミスは、Gibson、Fenderに次ぐ第3のギター" & _ "メーカーとして台頭してきました。" & _ "高級な材料をふんだんに使用し、" & _ "フレットにバードインレイをはめ込んだり、" & _ "10TOPと呼ばれる木目の板を使うなど、見た目も華麗に" & _ "作っていることが大きな特徴です。カルロス・サンタナが" & _ "使用したことで世界的に有名になりました。" ' レポートヘッダにフィールドを追加します。 Dim f As Field With Me.C1Report1.Sections(SectionTypeEnum.Header) '今あるヘッダーのFieldオブジェクトをコレクションから削除 .Fields.Remove(0) '新しいタイトル用Fieldオブジェクトをメーカー名を付けて作成 f = .Fields.Add("title", "製品情報 - " & _ Me.ComboBox1.SelectedItem, 100, 100, 8000, 1500) f.Font.Size = 24 f.Font.Bold = True f.ForeColor = Color.Beige 'すでに説明用のFieldオブジェクトがあれば削除する If .Fields.Count >= 2 Then .Fields.Remove("exp") End If End With 'ComboBoxで選択されたメーカーごとに説明文を作成 '-ここでは便宜上3つだけ作成 Select Case Me.ComboBox1.SelectedIndex Case 0 'ヘッダー「製品情報」の背景色とサイズを変更 With Me.C1Report1.Sections(SectionTypeEnum.Header) .Height = 1000 .Visible = True .BackColor = Color.BlueViolet '説明文用のフィールドの追加 f = .Fields.Add("exp", exp(0), 100, 800, 8000, 1500) f.Font.Size = 12 f.ForeColor = Color.Gold End With Case 1 With Me.C1Report1.Sections(SectionTypeEnum.Header) .Height = 1500 .Visible = True .BackColor = Color.PeachPuff '説明文用のフィールドの追加 f = .Fields.Add("exp", exp(1), 100, 800, 8000, 1500) f.Font.Size = 12 f.ForeColor = Color.Olive 'タイトル文字の色を入れ替える .Fields("title").ForeColor = Color.Blue End With Case 2 With Me.C1Report1.Sections(SectionTypeEnum.Header) .Height = 1500 .Visible = True .BackColor = Color.Chocolate '説明文用のフィールドの追加 f = .Fields.Add("exp", exp(2), 100, 800, 8000, 1500) f.Font.Size = 12 f.ForeColor = Color.Moccasin 'タイトル文字の色を入れ替える .Fields("title").ForeColor = Color.LimeGreen End With Case Else With Me.C1Report1.Sections(SectionTypeEnum.Header) .Height = 800 .BackColor = Color.DarkSeaGreen '説明文用のフィールドの追加 f = .Fields.Add("exp", "作業中・・・", 100, 800, _ 8000, 1500) End With End Select Me.C1PrintPreviewControl1.Document = Me.C1Report1.Document Me.C1PrintPreviewControl1.Invalidate() End Sub
private void button2_Click(object sender, EventArgs e) { String sqlstr; sqlstr = "SELECT 製品一覧.メーカー, 製品一覧.製品名, " + "製品一覧.カラー FROM(製品一覧)" + " WHERE ((製品一覧.メーカー)='" + ComboBox1.Text + "');"; c1Report1.DataSource.RecordSource = sqlstr; //メーカーごとの説明文を作成-ここでは便宜上3つだけ作成 String[] exp = new String[3]; exp[0] = "アメリカの老舗ギターブランド。エレキギターでは、" + "レスポール、SG、アコースティックギターではハミング" + "バード、ホロウ・ボディではES-335が代表的なギター。" + "レスポールは、レッドツエッペリンのジミーペイジ、B//sの" + "松本など数多くのプレーヤーに愛されてきました。"; exp[1] = "日本を代表するギターメーカー。布袋寅泰やX-Japanの" + "故Hide、L//Arc~en~Cielのkenなど、国内トップアー" + "ティストが使用しているブランド。入門者用からプロフェッ" + "ショナル用まで幅広いラインアップが揃っています。"; exp[2] = "ポールリードスミスは、Gibson、Fenderに次ぐ第3のギター" + "メーカーとして台頭してきました。高級な材料をふんだんに" + "使用し、フレットにバードインレイをはめ込んだり、" + "10TOPと呼ばれる木目の板を使うなど、見た目も華麗に" + "作っていることが大きな特徴です。カルロス・サンタナが" + "使用したことで世界的に有名になりました。"; // レポートヘッダにフィールドを追加します。 Field f ; Section s; s = c1Report1.Sections[SectionTypeEnum.Header]; //今あるヘッダーのFieldオブジェクトをコレクションから削除 s.Fields.Remove(0); //新しいタイトル用Fieldオブジェクトをメーカー名を付けて作成 f = s.Fields.Add("title", "製品情報 - " + ComboBox1.SelectedItem, 100, 100, 8000, 1500); f.Font.Size = 24; f.Font.Bold = true; f.ForeColor = Color.Beige; //すでに説明用のFieldオブジェクトがあれば削除する if(s.Fields.Count >= 2){ s.Fields.Remove("exp"); } //ComboBoxで選択されたメーカーごとに説明文を作成 //-ここでは便宜上3つだけ作成 switch(ComboBox1.SelectedIndex){ case 0: //ヘッダー「製品情報」の背景色とサイズを変更 s.Height = 1000; s.Visible = true; s.BackColor = Color.BlueViolet; //説明文用のフィールドの追加 f = s.Fields.Add("exp", exp[0], 100, 800, 8000, 1500); f.Font.Size = 12; f.ForeColor = Color.Gold; break; case 1: s.Height = 1500; s.Visible = true; s.BackColor = Color.PeachPuff; //説明文用のフィールドの追加 f = s.Fields.Add("exp", exp[1], 100, 800, 8000, 1500); f.Font.Size = 12; f.ForeColor = Color.Olive; //タイトル文字の色を入れ替える s.Fields["title"].ForeColor = Color.Blue; break; case 2: s.Height = 1500; s.Visible = true; s.BackColor = Color.Chocolate; //説明文用のフィールドの追加 f = s.Fields.Add("exp", exp[2], 100, 800, 8000, 1500); f.Font.Size = 12; f.ForeColor = Color.Moccasin; //タイトル文字の色を入れ替える s.Fields["title"].ForeColor = Color.LimeGreen; break; default: s.Height = 800; s.BackColor = Color.DarkSeaGreen; //説明文用のフィールドの追加 f = s.Fields.Add("exp", "作業中・・・", 100, 800, 8000, 1500); break; } c1PrintPreviewControl1.Document = c1Report1.Document; c1PrintPreviewControl1.Invalidate(); }