SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(ComponentOne)

データベースのデータからバブルチャートを作成する.NETアプリケーションを作る

「PowerTools ComponentOne Studio 2012J」のC1Chart2D/C1FlexGridコントロールを使った.NETアプリケーションの作成 その2

  • このエントリーをはてなブックマークに追加

バブルチャート作成処理

 グリッドのデータが更新されたので、これに基づくバブルチャート作成処理も修正を加えます。修正点は、グリッドの行列数と列見出しの数がデータベースごとに変わりますので、これをグリッドの変化に対応できるようにする部分です。

データ用配列の要素数をデータ数に合わせるように修正

 まずは、チャート作成用データがグリッドのデータ数によって変化しますので、これに合わせてデータを格納する配列の要素数も変えられるようにします。前回のアプリケーションでは、要素数を7個に固定していましたので、これを変数に変えます。

 チャート化するデータ数は、グリッドの行数で把握できます。これは、C1FlexGridコントロールのRowsコレクションオブジェクトのCountプロパティで取得できます。要素数のインデックスは0から始まりますから、Countプロパティの値から1を差し引きます。

 要素数の確保は、Visual BasicではReDimステートメントで、C#では配列の宣言時に行います。配列が確保できたら、C1FlexGridコントロールのGetDataDisplayメソッドでデータを取得していきます。

VB.NET
'----------------------- グラフ作成 ----------------------------------------------------
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
C#
//----------------------- グラフ作成 ----------------------------------------------------
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軸の軸目盛は変わらない、という状態になってしまいます。

 以上ででき上がりです。

VB.NET
'ラベルの作成
    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
C#
    //ラベルの作成
    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で使用できるデータベースであればどのようなデータベースでもデータを抽出してグラフ化できます。

 

参考資料(サンプルデータ)

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
ComponentZine(ComponentOne)連載記事一覧

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6831 2012/10/29 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング