ChartControlを利用したグラフの作成
ここからは、データソースとして指定したXMLファイルに含まれていない項目の表示部分について説明していきます。
ActiveReportsで帳票にグラフを描画するには、ChartControlコントロールを利用します。ツールバーからレポートデザイナ上のグラフを描画したい場所へChartControlコントロールをドロップすると、自動的にグラフウィザードが起動します。グラフウィザードでは、画面の指示に従って必要な項目を設定していくことでグラフを作成できます。
今回はグラフにバインドするデータソース(成績データを取得する部分)をまだ作っていないので、そのままの状態で「完了」ボタンを押し、いったんグラフウィザードを終了します。
今回の帳票ではX軸(横軸)に「テスト実施月」を、Y軸(縦軸)にテストの点数を取り、科目ごとに点数をバーで表示する簡単な棒グラフを作成します。

グラフを表示させるためのデータは、Accessデータベースに次のような形式で格納されています。
グラフに表示するためのデータを取得する
グラフは生徒ごとに別々のものを表示する必要があるので、データを取得するには生徒のID番号を指定して試験結果を取得する、以下のようなSQLを考えます。「?」の部分は実行時に生徒のID番号がバインドされます。
SELECT ExamName, MONTH(ExamDate) as ExamDate, StudentID, JapaneseScore, MathScore, EnglishScore FROM ExamResults WHERE StudentID = ? ORDER BY ExamDate
接続文字列は設定ファイルに書こう
前回までは便宜のため、ソースコード中に接続文字列を直接記述(ハードコーディング)していましたが、接続先データベースやアカウントの情報をハードコーディングしてしまうと、設定を変えるたびにソースを修正して再ビルドしなくてはならず、非常に不便です。
今回は、アプリケーション設定ファイル(App.config)に接続文字列を記述しておき、実行時に読み出す方法を紹介します。App.configには接続文字列を記述するためのconnectionStringsセクションが用意されているので、ここに接続文字列と設定名を記述します。ここではAccessデータベースへの接続と、SQL Serverへの接続を追加します。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <!--Accessデータベースへの接続--> <add name="access" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\ActiveReports3\Sample_05\Students.mdb; Persist Security Info=False"/> <!--SQL Serverデータベースへの接続--> <add name="sqlserver" connectionString="Data Source=localhost\sqlexpress; Database=Sample05;Trusted_Connection=SSPI; Persist Security Info=True;"/> </connectionStrings> </configuration>
App.configに定義した接続文字列をアプリケーション側で取得するには、System.Configuration.ConfigurationManagerクラスを使用します。ConfigurationManagerクラスを使う場合、ソースの先頭にUsing(VBの場合はImports)ディレクティブを追加するだけでなく、プロジェクトにSystem.Configuration.dllへの参照を追加する必要があります。
string connStr = ConfigurationManager.ConnectionStrings["access"].ConnectionString;
Dim connStr = _ ConfigurationManager.ConnectionStrings("access").ConnectionString
グラフに必要なデータの取得処理
App.configに接続文字列を記述したら、今度はActiveReports帳票のDetailFormatイベントに、生徒1人分のテスト結果データを取得してグラフを描画するためのコードを追加します。
private void detail_Format(object sender, EventArgs e) { this.chartControl1.Visible = true; //XMLの科目コード(EMJなど)を「英・数・国」などの表記に変更 //subjects(Dictionary型)の初期化はReportStartイベントで行う this.txtsubject1.Text = subjects[this.txtsubject1.Value.ToString()]; //クエリの定義 string query = "SELECT ExamName, MONTH(ExamDate) as ExamDate, StudentID, " + "JapaneseScore, MathScore, EnglishScore " + "FROM ExamResults " + "WHERE StudentID = ? " + "ORDER BY ExamDate "; //設定ファイルから接続文字列を取得する string connStr = ConfigurationManager.ConnectionStrings["access"].ConnectionString; //Accessデータベースに接続し、取得したデータをDataTableに格納する DataTable dt = new DataTable(); using (OleDbConnection conn = new OleDbConnection(connStr)) { OleDbCommand cmd = new OleDbCommand(query, conn); cmd.Parameters.Add(new OleDbParameter( "id", this.txtIdHidden.Value)); OleDbDataAdapter da = new OleDbDataAdapter(cmd); da.Fill(dt); } //DataTableをChartControlのデータソースに設定する this.chartControl1.DataSource = dt; }
Private Sub Detail_Format(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Detail.Format Me.ChartControl1.Visible = True 'XMLの科目コード(EMJなど)を「英・数・国」などの表記に変更 'subjects(Dictionary型)の初期化はReportStartイベントで行う Me.TextSubject1.Text = subjects(Me.TextSubject1.Value.ToString()) '設定ファイルから接続文字列を取得する Dim connStr = _ ConfigurationManager.ConnectionStrings("access").ConnectionString Dim query _ = "SELECT ExamName, MONTH(ExamDate) as ExamDate, StudentID, " _ & "JapaneseScore, MathScore, EnglishScore " _ & "FROM ExamResults " _ & "WHERE StudentID = ? " _ & "ORDER BY ExamDate " 'Accessデータベースに接続し、取得したデータをDataTableに格納する Dim dt As New DataTable Using conn As New OleDbConnection(connStr) Dim cmd As New OleDbCommand(query, conn) cmd.Parameters.Add(New OleDbParameter( _ "id", Me.TxtIdHidden.Value)) Dim da As New OleDbDataAdapter(cmd) da.Fill(dt) End Using 'DataTableをChartControlのデータソースに設定する Me.ChartControl1.DataSource = dt End Sub
取得したデータとChartControlコントロールのマッピング
グラフ表示に使うデータ取得処理ができあがったら、次はChartControlコントロールとグラフデータの紐付けを行います。プロパティウィンドウの右下に表示されている「グラフ デザイナ」のリンクをクリックすると、グラフデザイナが起動されます。
グラフデザイナのウィンドウが表示されたら、左側に表示されている「系列」ボタンをクリックし、グラフに表示するアイテム(国語、数学、英語)を追加していきます。左上に表示されている「アイテム追加ボタン」をクリックしてアイテムを追加し、オブジェクト名を「Japanese」とします。また、X軸のデータバインドには「ExamDate」を、Y軸のデータバインドには「JapaneseScore」を入力します。同様の手順で数学(Math)、英語(English)の系列も追加します。
グラフデザイナではこの他「グラフエリア」「タイトル」「凡例」「概観」などの設定項目を変更することで、グラフの見栄えを設定できます。

今回グラフデザイナで設定した項目
- グラフエリア:3Dをオフにする
- グラフエリア-軸(AxisX)「全般」タブ:種類=カテゴリ軸、最大値=6、タイトル=なし
- グラフエリア-軸(AxisY)「全般」タブ:種類=数値軸、最大値=100、タイトル=Score
- グラフエリア-軸(AxisY)「ラベル」タブ:「表示」にチェック
- タイトル:ヘッダ、フッタを非表示
- 凡例:「タイトル」タブ→ヘッダ、フッタを非表示
- 概観:パレットを「Greens」に変更、グラフ全体の背景を白(単色)に変更
OleObjectコントロールによるExcelワークシートの貼り付け
帳票フッタでは、これまでに実施した学力テストの平均偏差値とテストの平均点を表形式で表示しています。これは、特に複雑なことをやっているわけではなく、Excelワークシートをそのまま表示させています。ActiveReports帳票でExcelワークシートなどのOLEオブジェクトを取り込んで表示するには、OleObjectコントロールを使用します。
OleObjectコントロールをレポートデザイナへドラッグ&ドロップすると、挿入オブジェクトを指定するダイアログが表示されるので、目的のファイルを読み込みます。
このコントロールは実行環境にExcelがインストールされていなくてもコントロールの描画を行いますが、実行環境にActiveReports.Interop.dll がないとエラーメッセージが表示されてしまいますので注意が必要です。
このコントロールはAccessデータベースなどのDB内のOleObjectをバインドする用途でも利用できますが、CanGrowプロパティがないので、固定幅で表示されます。