目標・プログラムの詳細
〇目標: コンボボックスの選択項目に応じた、グラフの再描画。
〇プログラムの詳細: 数値を格納している、3つのデータA,B,Cがある状況を仮定してください。
縦軸や横軸にしたいデータをコンボボックスから変更すれば、グラフが再描画されるプログラムを目指しています。
現状・問題・エラーメッセージ
〇現状: コンボボックス自体は選べる状態になっています。
軸ラベルは変更させることに成功しています。
〇問題: コンボボックスの項目を変更しても、グラフが再描画されません。
〇エラーメッセージ:
・System.ArgumentNullException: ''name' 引数を Null にすることはできません。:
comboBox1_SelectedIndexChanged内で
該当のソースコード
using
1using System.Data; 2using System.Windows.Forms; 3using System.Windows.Forms.DataVisualization.Charting; 4using System.Drawing; 5 6namespace windo 7{ 8 9 public partial class Form1 : Form 10 { 11 12 public Form1() 13 { 14 15 InitializeComponent(); 16 17 } 18 19 private void Form1_Load(object sender, EventArgs e) 20 { 21 22 chart1.Series.Clear(); 23 chart1.ChartAreas.Clear(); 24 25 // グラフを描く空間を生成 26 ChartArea chartArea = new ChartArea(); 27 chart1.ChartAreas.Add(chartArea); 28 29 // グラフの元となるデータの格納場所を生成 30 Series series1 = new Series(); 31 32 // データの格納表を作成 33 DataTable table = new DataTable(); 34 35 // データ名をつける 36 table.Columns.Add("A", typeof(double)); 37 table.Columns.Add("B", typeof(double)); 38 table.Columns.Add("C", typeof(double)); 39 40 // 表にデータを格納 41 table.Rows.Add(new Object[] { 1, 5000000, 55 }); 42 table.Rows.Add(new Object[] { 2, 4000000, 44 }); 43 table.Rows.Add(new Object[] { 3, 3000000, 33 }); 44 45 // コンボボックスに項目名を格納 46 comboBox1.Items.AddRange(new string[] { "A", "B", "C" }); 47 comboBox2.Items.AddRange(new string[] { "A", "B", "C" }); 48 49 // コンボボックスの説明をするテキストボックスを格納 50 textBox1.Text = "横軸のデータ"; 51 textBox2.Text = "縦軸のデータ"; 52 53 // コンボボックスの初期値を設定 54 comboBox1.SelectedIndex = 0; 55 comboBox2.SelectedIndex = 0; 56 57 //コンボボックスで選んだデータ名を読み込む 58 object Select_X = comboBox1.SelectedItem; 59 var X_Data = Select_X.ToString(); 60 object Select_Y = comboBox2.SelectedItem; 61 var Y_Data = Select_Y.ToString(); 62 63 //尋ねたデータ名を軸ラベルにする 64 chart1.ChartAreas[0].AxisX.Title = X_Data; 65 chart1.ChartAreas[0].AxisY.Title = Y_Data; 66 67 //データをグラフにプロット 68 for (int i = 0; i < table.Rows.Count; i++) 69 { 70 series1.Points.AddXY(table.Rows[i][X_Data], table.Rows[i][Y_Data]); 71 } 72 chart1.Series.Add(series1); 73 74 } 75 76 //コンボボックス1の項目を選び直した時の処理 77 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e,DataTable table) 78 { 79 80 //データの上書きのために、一度作ったseries1を消去 81 chart1.Series.Clear(); 82 83 //グラフの元となるデータの格納場所を生成 84 Series series1 = new Series(); 85 86 //コンボボックスで選び直したデータ名を読み込む 87 object Select_X = comboBox1.SelectedItem; 88 var X_Data = Select_X.ToString(); 89 object Select_Y = comboBox2.SelectedItem; 90 var Y_Data = Select_Y.ToString(); 91 92 //尋ねたデータ名を軸ラベルにする 93 chart1.ChartAreas[0].AxisX.Title = X_Data; 94 chart1.ChartAreas[0].AxisY.Title = Y_Data; 95 96 //データをグラフにプロット 97 for (int i = 0; i < table.Rows.Count; i++) 98 { 99 series1.Points.AddXY(table.Rows[i][X_Data], table.Rows[i][Y_Data]); 100 } 101 chart1.Series.Add(series1); 102 } 103 104 //コンボボックス2の項目を選び直した時の処理 105 private void comboBox2_SelectedIndexChanged(object sender, EventArgs e, DataTable table) 106 { 107 108 //データの上書きのために、一度作ったseries1を消去 109 chart1.Series.Clear(); 110 111 //グラフの元となるデータの格納場所を生成 112 Series series1 = new Series(); 113 114 //コンボボックスで選び直したデータ名を読み込む 115 object Select_X = comboBox1.SelectedItem; 116 var X_Data = Select_X.ToString(); 117 object Select_Y = comboBox2.SelectedItem; 118 var Y_Data = Select_Y.ToString(); 119 120 //尋ねたデータ名を軸ラベルにする 121 chart1.ChartAreas[0].AxisX.Title = X_Data; 122 chart1.ChartAreas[0].AxisY.Title = Y_Data; 123 124 //データをグラフにプロット 125 for (int i = 0; i < table.Rows.Count; i++) 126 { 127 series1.Points.AddXY(table.Rows[i][X_Data], table.Rows[i][Y_Data]); 128 } 129 130 chart1.Series.Add(series1); 131 } 132 } 133}
試したこと
① comboBox_SelectedIndexChangedを使用して、コンボボックスに関するイベントを発生させようとした
② オーバーロードやデリゲートの意味を調べた しかし、解決の糸口が見つからなかった
補足情報
Visual Studio 2019
.NET Framework 4.7.2
回答2件
あなたの回答
tips
プレビュー