バブルチャート作成処理
グリッドのデータが更新されたので、これに基づくバブルチャート作成処理も修正を加えます。修正点は、グリッドの行列数と列見出しの数がデータベースごとに変わりますので、これをグリッドの変化に対応できるようにする部分です。
データ用配列の要素数をデータ数に合わせるように修正
まずは、チャート作成用データがグリッドのデータ数によって変化しますので、これに合わせてデータを格納する配列の要素数も変えられるようにします。前回のアプリケーションでは、要素数を7個に固定していましたので、これを変数に変えます。
チャート化するデータ数は、グリッドの行数で把握できます。これは、C1FlexGridコントロールのRowsコレクションオブジェクトのCountプロパティで取得できます。要素数のインデックスは0から始まりますから、Countプロパティの値から1を差し引きます。
要素数の確保は、Visual BasicではReDimステートメントで、C#では配列の宣言時に行います。配列が確保できたら、C1FlexGridコントロールのGetDataDisplayメソッドでデータを取得していきます。
'----------------------- グラフ作成 ---------------------------------------------------- Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click 'Dim xp(6) As Integer 'Dim yp(6) As Integer 'Dim vol(6) As Integer 'Dim i As Integer 'グリッドからデータを取得 'For i = 0 To 6 ' xp(i) = Convert.ToInt16(C1FlexGrid1.GetDataDisplay(i + 1, 2)) ' yp(i) = Convert.ToInt16(C1FlexGrid1.GetDataDisplay(i + 1, 3)) ' vol(i) = Convert.ToInt16(C1FlexGrid1.GetDataDisplay(i + 1, 4)) 'Next i '★ 配列数の確保をデータ数に合わせるように修正 Dim rownum As Integer = C1FlexGrid1.Rows.Count - 2 Dim xp() As Integer Dim yp() As Integer Dim vol() As Integer Dim i As Integer ReDim xp(rownum) ReDim yp(rownum) ReDim vol(rownum) For i = 0 To C1FlexGrid1.Rows.Count - 2 xp(i) = Convert.ToInt16(C1FlexGrid1.GetDataDisplay(i + 1, 2)) yp(i) = Convert.ToInt16(C1FlexGrid1.GetDataDisplay(i + 1, 3)) vol(i) = Convert.ToInt16(C1FlexGrid1.GetDataDisplay(i + 1, 4)) Next i
//----------------------- グラフ作成 ---------------------------------------------------- private void button2_Click(object sender, EventArgs e) { //int[] xp = new int[7]; //int[] yp = new int[7]; //int[] vol = new int[7]; //int i; ////FlexGridからデータを取得 //for(i=0; i<=6; i++) //{ // xp[i] = Convert.ToInt16(c1FlexGrid1.GetDataDisplay(i + 1, 2)); // yp[i] = Convert.ToInt16(c1FlexGrid1.GetDataDisplay(i + 1, 3)); // vol[i] = Convert.ToInt16(c1FlexGrid1.GetDataDisplay(i + 1, 4)); //} // ★ 配列数の確保をデータ数に合わせるように修正 int rownum = c1FlexGrid1.Rows.Count - 1; int[] xp = new int[rownum]; int[] yp = new int[rownum]; int[] vol = new int[rownum]; int i; //FlexGridからデータを取得 for (i = 0; i <= c1FlexGrid1.Rows.Count-2; i++) { xp[i] = Convert.ToInt16(c1FlexGrid1.GetDataDisplay(i + 1, 2)); yp[i] = Convert.ToInt16(c1FlexGrid1.GetDataDisplay(i + 1, 3)); vol[i] = Convert.ToInt16(c1FlexGrid1.GetDataDisplay(i + 1, 4)); }
データラベルの修正と表示範囲の自動設定を追加
チャートデータが設定できたら、データラベルを更新する処理を作成します。
また、チャートデータが入れ替わりますので、データの表示範囲も一度リセットするために、最大値と最小値を自動的に設定できるようにします。
(1)新しいチャートデータに合わせてラベルを新しく作り直します。ラベルデータの作成は前回と同じですが、Forループの繰り返し回数をチャートデータ数に合わせます。
(2)そして、ChartAreaクラスのAxisX、AxisYオブジェクトの「AutoMax」「AutoMin」プロパティをTrue設定し、チャートの表示範囲をデータに合わせる自動設定に切り替えておきます。この処理をしておかないと、チャートデータが切り替わってもXY軸の軸目盛は変わらない、という状態になってしまいます。
以上ででき上がりです。
'ラベルの作成 Dim lab As C1.Win.C1Chart.Label ' 一度ラベルを削除 If C1Chart1.ChartLabels.LabelsCollection.Count > 0 Then C1Chart1.ChartLabels.LabelsCollection.RemoveAll() End If '(1)★ ラベルの個数を修正しデータ数に自動設定 'For i = 0 To 6 For i = 0 To C1FlexGrid1.Rows.Count - 2 lab = C1Chart1.ChartLabels.LabelsCollection.AddNewLabel() lab.Text = C1FlexGrid1.GetDataDisplay(i + 1, 1) lab.Compass = LabelCompassEnum.East lab.AttachMethod = AttachMethodEnum.DataIndex lab.AttachMethodData.GroupIndex = 0 lab.AttachMethodData.SeriesIndex = 0 lab.AttachMethodData.PointIndex = i lab.Style.BackColor = Color.Transparent lab.Visible = True Next '(2)★ 一度表示範囲を自動にリセット C1Chart1.ChartArea.AxisX.AutoMax = True C1Chart1.ChartArea.AxisX.AutoMin = True C1Chart1.ChartArea.AxisY.AutoMax = True C1Chart1.ChartArea.AxisY.AutoMin = True End Sub
//ラベルの作成 C1.Win.C1Chart.Label lab ; // 一度ラベルを削除 if(c1Chart1.ChartLabels.LabelsCollection.Count>0) { c1Chart1.ChartLabels.LabelsCollection.RemoveAll(); } //(1)★ ラベルの個数を修正しデータ数に自動設定 // for (i = 0; i <= 6; i++) for (i = 0; i <= c1FlexGrid1.Rows.Count-2; i++) { lab = c1Chart1.ChartLabels.LabelsCollection.AddNewLabel(); lab.Text = c1FlexGrid1.GetDataDisplay(i + 1, 1); lab.Compass = LabelCompassEnum.East; lab.AttachMethod = AttachMethodEnum.DataIndex; lab.AttachMethodData.GroupIndex = 0; lab.AttachMethodData.SeriesIndex = 0; lab.AttachMethodData.PointIndex = i; lab.Style.BackColor = Color.Transparent; lab.Visible = true; } //(2)★ 一度表示範囲を自動にリセット c1Chart1.ChartArea.AxisX.AutoMax = true; c1Chart1.ChartArea.AxisX.AutoMin = true; c1Chart1.ChartArea.AxisY.AutoMax = true; c1Chart1.ChartArea.AxisY.AutoMin = true; }
まとめ
チャートデータにデータベースが使えるようになると、アプリケーションの利用範囲も広がります。
サンプルアプリケーションなので、チャートデータの抽出に直接クエリ文を入力するようにしましたが、ユーザーフレンドリーなアプリケーションに仕上げるのであれば、このクエリの入力処理も簡単にできるように作成しておくと良いですね。
また、バブルチャートもChartAreaクラスのメンバを使用すればより細かな装飾ができますし、元データの列数から棒グラフや折れ線グラフも表示できるような機能を実装すれば、より使い勝手のあるチャート作成アプリケーションに仕上げることができます。
今回は、Accessのデータベースファイルを使用しましたが、ADO.NETで使用できるデータベースであればどのようなデータベースでもデータを抽出してグラフ化できます。