C#
.NET

.NET標準のグラフ(chart)の種類を動的に変更する(2/2)

続き

.NET標準のグラフ(chart)の種類を動的に変更する(1/2)から

やりたいことの感じはつかめたので少しだけブラッシュアップ。
選択肢のグラフがすべて英語なのでわかりづらい、日本語でおkという感じなので
SeriesChartTypeのメンバ名をKey、その日本語名をValueとしたい。

Dictionary? それともKeyValuePair?
ここはどちらも使わず、格納用のクラスを作成。

SeriesChartTypeKeyValue.cs
class SeriesChartTypeKeyValue
{
    public SeriesChartType SeriesChartType { get; set; }
    public string SeriesChartTypeJPN { get; set; }

    public SeriesChartTypeKeyValue(SeriesChartType seriesChartType, string seriesChartTypeJPN)
    {
        this.SeriesChartType = seriesChartType;
        this.SeriesChartTypeJPN = seriesChartTypeJPN;
    }
}

グラフは右側を広げて適当に配置します。
キャプチャ.PNG

同様にComboBoxに設定するリストを作成する。

Form1.cs
private readonly List<SeriesChartTypeKeyValue> _seriesChartTypeKeyValueList = new List<SeriesChartTypeKeyValue>
                {
                        new SeriesChartTypeKeyValue(SeriesChartType.Area, "面グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Bar, "横棒グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.BoxPlot,"ボックスプロットグラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Bubble,"バブルチャート"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Candlestick,"ローソク足チャート"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Column,"縦棒グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Doughnut,"ドーナツグラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.ErrorBar,"誤算範囲グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.FastLine,"FastLineグラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.FastPoint,"FastPointグラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Funnel,"じょうごグラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Kagi,"かぎ足チャート"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Line,"折れ線グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Pie,"円グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Point,"ポイントグラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.PointAndFigure,"PointAndFigureグラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Polar,"極座標グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Pyramid,"ピラミッドグラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Radar,"レーダーチャート"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Range,"範囲グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.RangeBar,"RangeBarグラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.RangeColumn,"範囲縦棒グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Renko,"練行足チャート"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Spline,"スプライングラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.SplineArea,"スプライン面グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.SplineRange,"スプライン範囲グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.StackedArea,"積み上げ面グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.StackedArea100,"100%積み上げグラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.StackedBar,"積み上げ横棒グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.StackedBar100,"100%積み上げ横棒グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.StackedColumn,"積み上げ縦棒グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.StackedColumn100,"100%積み上げ縦棒グラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.StepLine,"StepLineグラフ"),
                        new SeriesChartTypeKeyValue(SeriesChartType.Stock,"株価チャート"),
                        new SeriesChartTypeKeyValue(SeriesChartType.ThreeLineBreak,"ThreeLineBreakグラフ")
                };

あとは1つ目のときと同じように処理を書いてやればいい。

気をつける点はComboBoxのイベント処理でキャストを忘れないこと。

Form1.cs
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
    if (comboBox2.SelectedItem != null) { 
        chart2.Series["Sample2"].ChartType = ((SeriesChartTypeKeyValue)comboBox2.SelectedItem).SeriesChartType;
    }
}

あとはComboBoxのKey値とValue値のプロパティの設定を忘れないこと。

Form1.cs
private void Form1_Load(object sender, EventArgs e)
{
    comboBox1.DataSource = _seriesChartTypeList;

    comboBox2.DataSource = _seriesChartTypeKeyValueList;
    comboBox2.ValueMember = "SeriesChartType";
    comboBox2.DisplayMember = "SeriesChartTypeJPN";
}

動かしたらこんな感じ

キャプチャ.PNG

最後に

まあ仕事では外部のライブラリ製品使うことになるんですけどね。(きっと、おそらく、多分、そうであってくれ)