質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

解決済

c#: コンボボックス選択に応じた、グラフの再描画

rinshu
rinshu

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

2回答

-1評価

0クリップ

625閲覧

投稿2021/10/28 05:09

編集2021/10/29 05:18

目標・プログラムの詳細

〇目標: コンボボックスの選択項目に応じた、グラフの再描画。

〇プログラムの詳細: 数値を格納している、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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

SurferOnWww

2021/10/28 05:54

まず、何はともあれ、コードは ``` と ``` で囲ってください。インデントされて見やすくなるので。インデントされてないコードは質問者さん自身も読む気がしないのでは?
rinshu

2021/10/28 07:09 編集

ご回答ありがとうございます。 囲みました。
BluOxy

2021/10/29 04:25

コンパイルエラーが直っても 再描画できない という問題が解決しないのでしたら、「現状・問題・エラーメッセージ」欄にどういう問題で解決できていないのかを載せるとそれに対する回答がもらえるかもしれません。
rinshu

2021/10/29 04:34

BluOxyさん、ご回答ありがとうございます。
BluOxy

2021/10/29 09:44 編集

「デリゲート'EventHandler'に一致する'comboBox〇_SelectedIndexChanged'のオーバーロードはありません」が出ていたが解決した件は質問に残しておかないと、質問と回答が噛み合わなくなると思うので、その経緯は残したままの方が良いと思います。 (質問の編集履歴から以前残したメッセージを拾ってくることができますので、活用してください) 通常 1 つの質問ページに対して複数個の問題解決を試みようとすると必然的に質問の情報量が大きくなりますから、もし整理が難しいようなら、コンパイルエラーの件は解決したということでこの質問は閉じていただいて、別途質問を立てるのが良いかと思います。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。