目標・プログラムの詳細
〇目標: コンボボックスの選択項目に応じた、グラフの再描画。
〇プログラムの詳細: 数値を格納している、3つのデータA,B,Cがある状況を仮定してください。
縦軸や横軸にしたいデータをコンボボックスから変更すれば、グラフが再描画されるプログラムを目指しています。
現状・問題・エラーメッセージ
〇現状: コンボボックス自体は選べる状態になっています。
軸ラベルは変更させることに成功しています。
〇問題: コンボボックスの項目を変更しても、グラフが再描画されません。
〇エラーメッセージ:
・System.ArgumentNullException: ''name' 引数を Null にすることはできません。:
comboBox1_SelectedIndexChanged内で
該当のソースコード
using
using System.Data; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; using System.Drawing; namespace windo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { chart1.Series.Clear(); chart1.ChartAreas.Clear(); // グラフを描く空間を生成 ChartArea chartArea = new ChartArea(); chart1.ChartAreas.Add(chartArea); // グラフの元となるデータの格納場所を生成 Series series1 = new Series(); // データの格納表を作成 DataTable table = new DataTable(); // データ名をつける table.Columns.Add("A", typeof(double)); table.Columns.Add("B", typeof(double)); table.Columns.Add("C", typeof(double)); // 表にデータを格納 table.Rows.Add(new Object[] { 1, 5000000, 55 }); table.Rows.Add(new Object[] { 2, 4000000, 44 }); table.Rows.Add(new Object[] { 3, 3000000, 33 }); // コンボボックスに項目名を格納 comboBox1.Items.AddRange(new string[] { "A", "B", "C" }); comboBox2.Items.AddRange(new string[] { "A", "B", "C" }); // コンボボックスの説明をするテキストボックスを格納 textBox1.Text = "横軸のデータ"; textBox2.Text = "縦軸のデータ"; // コンボボックスの初期値を設定 comboBox1.SelectedIndex = 0; comboBox2.SelectedIndex = 0; //コンボボックスで選んだデータ名を読み込む object Select_X = comboBox1.SelectedItem; var X_Data = Select_X.ToString(); object Select_Y = comboBox2.SelectedItem; var Y_Data = Select_Y.ToString(); //尋ねたデータ名を軸ラベルにする chart1.ChartAreas[0].AxisX.Title = X_Data; chart1.ChartAreas[0].AxisY.Title = Y_Data; //データをグラフにプロット for (int i = 0; i < table.Rows.Count; i++) { series1.Points.AddXY(table.Rows[i][X_Data], table.Rows[i][Y_Data]); } chart1.Series.Add(series1); } //コンボボックス1の項目を選び直した時の処理 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e,DataTable table) { //データの上書きのために、一度作ったseries1を消去 chart1.Series.Clear(); //グラフの元となるデータの格納場所を生成 Series series1 = new Series(); //コンボボックスで選び直したデータ名を読み込む object Select_X = comboBox1.SelectedItem; var X_Data = Select_X.ToString(); object Select_Y = comboBox2.SelectedItem; var Y_Data = Select_Y.ToString(); //尋ねたデータ名を軸ラベルにする chart1.ChartAreas[0].AxisX.Title = X_Data; chart1.ChartAreas[0].AxisY.Title = Y_Data; //データをグラフにプロット for (int i = 0; i < table.Rows.Count; i++) { series1.Points.AddXY(table.Rows[i][X_Data], table.Rows[i][Y_Data]); } chart1.Series.Add(series1); } //コンボボックス2の項目を選び直した時の処理 private void comboBox2_SelectedIndexChanged(object sender, EventArgs e, DataTable table) { //データの上書きのために、一度作ったseries1を消去 chart1.Series.Clear(); //グラフの元となるデータの格納場所を生成 Series series1 = new Series(); //コンボボックスで選び直したデータ名を読み込む object Select_X = comboBox1.SelectedItem; var X_Data = Select_X.ToString(); object Select_Y = comboBox2.SelectedItem; var Y_Data = Select_Y.ToString(); //尋ねたデータ名を軸ラベルにする chart1.ChartAreas[0].AxisX.Title = X_Data; chart1.ChartAreas[0].AxisY.Title = Y_Data; //データをグラフにプロット for (int i = 0; i < table.Rows.Count; i++) { series1.Points.AddXY(table.Rows[i][X_Data], table.Rows[i][Y_Data]); } chart1.Series.Add(series1); } } }
試したこと
① comboBox_SelectedIndexChangedを使用して、コンボボックスに関するイベントを発生させようとした
② オーバーロードやデリゲートの意味を調べた しかし、解決の糸口が見つからなかった
補足情報
Visual Studio 2019
.NET Framework 4.7.2
まだ回答がついていません
会員登録して回答してみよう