teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2021/10/30 02:56

投稿

退会済みユーザー
answer CHANGED
@@ -25,4 +25,149 @@
25
25
  this.table = new DataTable();
26
26
  ```
27
27
 
28
- もちろん、イベントハンドラの引数 DataTable table は削除してください。
28
+ もちろん、イベントハンドラの引数 DataTable table は削除してください。
29
+
30
+ **【追記】**
31
+
32
+ 下のコメント欄の 2021/10/30 11:10 の私のコメントで「後で回答欄に何がダメなのかと解決のための案を書いておきます。」と書いた件です。
33
+
34
+ コメント欄に書きましたように、質問者さんのコードをコピーして、上の回答で指摘したところは直して、試してみましたが「''name' 引数を Null にすることはできません」というエラーは出ません。質問に書いてないことをしてませんか?
35
+
36
+ そのエラーは出ませんが、質問のコードには以下の問題があって別のエラーが出ますし、そこを解決しても ComboBox の操作では期待したようには切り替わりません。
37
+
38
+ (1) 質問のコードの Form_Load で「コンボボックスの初期値を設定」としているところで ComboBox.SelectedIndexChanged イベントが発生する。comboBox1.SelectedIndex = 0; が先なのでまず comboBox1 のイベントハンドラに制御が飛ぶが、その時点では comboBox2.SelectedItem はまだ null なので Select_Y.ToString(); で NullReferenceException がスローされる。
39
+
40
+ SelectedIndex が null か否かをチェックして null だったら何もしないで return すれば回避できます。
41
+
42
+ (2) 質問のコードでは、ComboBox.SelectedIndexChanged イベントのハンドラと Form_Load の両方で Chart を生成しているが、上に書いたように Form_Load で「コンボボックスの初期値を設定」としているところでイベントが発生するので初期画面でダブってしまい、その後の ComboBox の操作でも意味不明な動きになる。
43
+
44
+ ComboBox.SelectedIndexChanged イベントのハンドラ内だけで Chart を生成すれば期待した動きになります。
45
+
46
+ 検証に使ったコードを以下に書いておきます。質問者さんのコードをほぼコピペして、上に述べた回避策を取ったものです。
47
+
48
+ ```C#
49
+ using System;
50
+ using System.Data;
51
+ using System.Windows.Forms.DataVisualization.Charting;
52
+ using System.Windows.Forms;
53
+
54
+ namespace WindowsFormsChart
55
+ {
56
+ public partial class Form2 : Form
57
+ {
58
+ private Chart chart1;
59
+ private DataTable table;
60
+
61
+ public Form2()
62
+ {
63
+ InitializeComponent();
64
+
65
+ chart1 = new Chart
66
+ {
67
+ Location = new System.Drawing.Point(50, 50),
68
+ Width = 600
69
+ };
70
+ Controls.Add(chart1);
71
+ }
72
+
73
+ private void Form2_Load(object sender, EventArgs e)
74
+ {
75
+ // ここでは Chart は作らない
76
+
77
+ table = new DataTable();
78
+
79
+ // データ名をつける
80
+ table.Columns.Add("A", typeof(double));
81
+ table.Columns.Add("B", typeof(double));
82
+ table.Columns.Add("C", typeof(double));
83
+
84
+ // 表にデータを格納
85
+ table.Rows.Add(new Object[] { 1, 5000000, 55 });
86
+ table.Rows.Add(new Object[] { 2, 4000000, 44 });
87
+ table.Rows.Add(new Object[] { 3, 3000000, 33 });
88
+
89
+ // コンボボックスに項目名を格納
90
+ comboBox1.Items.AddRange(new string[] { "A", "B", "C" });
91
+ comboBox2.Items.AddRange(new string[] { "A", "B", "C" });
92
+
93
+ //コンボボックスの初期値を設定
94
+ comboBox1.SelectedIndex = 0;
95
+ comboBox2.SelectedIndex = 0;
96
+ }
97
+
98
+ private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
99
+ {
100
+ //コンボボックスで選び直したデータ名を読み込む
101
+ object Select_X = comboBox1.SelectedItem;
102
+ object Select_Y = comboBox2.SelectedItem;
103
+
104
+ // Form_Load の comboBox1.SelectedIndex = 0; でイベントが発生
105
+ // した時は comboBox2.SelectedItem は null
106
+ if (Select_X == null || Select_Y == null) return;
107
+
108
+ var X_Data = Select_X.ToString();
109
+ var Y_Data = Select_Y.ToString();
110
+
111
+ chart1.Series.Clear();
112
+ chart1.ChartAreas.Clear();
113
+
114
+ // グラフを描く空間を生成
115
+ ChartArea chartArea = new ChartArea();
116
+ chart1.ChartAreas.Add(chartArea);
117
+
118
+ // グラフの元となるデータの格納場所を生成
119
+ Series series1 = new Series();
120
+
121
+ //尋ねたデータ名を軸ラベルにする
122
+ chart1.ChartAreas[0].AxisX.Title = X_Data;
123
+ chart1.ChartAreas[0].AxisY.Title = Y_Data;
124
+
125
+ //データをグラフにプロット
126
+ for (int i = 0; i < table.Rows.Count; i++)
127
+ {
128
+ series1.Points.AddXY(table.Rows[i][X_Data], table.Rows[i][Y_Data]);
129
+ }
130
+ chart1.Series.Add(series1);
131
+ }
132
+
133
+ private void comboBox2_SelectedValueChanged(object sender, EventArgs e)
134
+ {
135
+ //コンボボックスで選び直したデータ名を読み込む
136
+ object Select_X = comboBox1.SelectedItem;
137
+ object Select_Y = comboBox2.SelectedItem;
138
+
139
+ // Form_Load の「コンボボックスの初期値を設定」順であれば null になる
140
+ // ことはなさそうだが念のため
141
+ if (Select_X == null || Select_Y == null) return;
142
+
143
+ var X_Data = Select_X.ToString();
144
+ var Y_Data = Select_Y.ToString();
145
+
146
+ chart1.Series.Clear();
147
+ chart1.ChartAreas.Clear();
148
+
149
+ // グラフを描く空間を生成
150
+ ChartArea chartArea = new ChartArea();
151
+ chart1.ChartAreas.Add(chartArea);
152
+
153
+ // グラフの元となるデータの格納場所を生成
154
+ Series series1 = new Series();
155
+
156
+ //尋ねたデータ名を軸ラベルにする
157
+ chart1.ChartAreas[0].AxisX.Title = X_Data;
158
+ chart1.ChartAreas[0].AxisY.Title = Y_Data;
159
+
160
+ //データをグラフにプロット
161
+ for (int i = 0; i < table.Rows.Count; i++)
162
+ {
163
+ series1.Points.AddXY(table.Rows[i][X_Data], table.Rows[i][Y_Data]);
164
+ }
165
+ chart1.Series.Add(series1);
166
+ }
167
+ }
168
+ }
169
+ ```
170
+
171
+ 結果は以下のようになります。
172
+
173
+ ![イメージ説明](3ad0ae85720d30bbc53263b8ecc4ca55.jpeg)