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

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

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

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

Q&A

解決済

1回答

5279閲覧

ComboBoxの選択した項目によって他のcomboBoxの表示内容を変更したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2019/12/18 05:03

前提・実現したいこと

初心者です。
1列目で項目を選択し、2列目でどのComboBoxの項目を使用するか選択し、3列目で2列目で選択したcomboBoxの項目の値を表示をさせたいです。
イメージ説明

発生している問題・エラーメッセージ

・1回値を表示させた状態ですでに2列目で選択されているcomboBoxの項目を変更した場合、3列目の値に反映されない。
・1回値を表示させた状態で2列目のcomboBoxで1列目の他のcomboBoxを選択しなおすと3列目の値に反映されない。
・1列目のcomboBoxで2つ以上項目を設定していると後ろのcomboBoxの値になる。(例えばコンボ2とコンボ3でそれぞれ別の項目を設定して、2列目のcomboBoxでコンボ2を選択していてもコンボ3の値を表示)

該当のソースコード

C#

1public partial class Form1 : Form 2 { 3 private const String s1 = "コンボ1"; 4 private const String s2 = "コンボ2"; 5 private const String s3 = "コンボ3"; 6 private const String s4 = "コンボ4"; 7 8 private const String kou1 = "項目1"; 9 private const String kou2 = "項目2"; 10 private const String kou3 = "項目3"; 11 12 public Form1() 13 { 14 InitializeComponent(); 15 } 16 private void MainForm_Shown(object sender, EventArgs e) 17 { 18 try 19 { 20 String[] strsSelect = new String[] { s1, s2, s3, s4 }; 21 comboBox1.Items.AddRange(strsSelect); 22 23 String[] strsSource = new String[] { kou1, kou2, kou3 }; 24 comboBox2.Items.AddRange(strsSource); 25 comboBox3.Items.AddRange(strsSource); 26 comboBox4.Items.AddRange(strsSource); 27 comboBox5.Items.AddRange(strsSource); 28 } 29 catch (Exception ex) 30 { 31 MessageBox.Show(ex.Message + Environment.NewLine + ex.StackTrace); 32 } 33 } 34 35 private void button1_Click(object sender, EventArgs e) 36 { 37 38 } 39 40 private void select_cbx(object sender, EventArgs e) 41 { 42 if (comboBox1.SelectedIndex >= 0) 43 { 44 chk_value(); 45 } 46 } 47 48 private void chk_value() 49 { 50 String[] strtext = new String[] { comboBox2.Text, comboBox3.Text, comboBox4.Text, comboBox5.Text }; 51 52 string[] c6kou1 = new string[] { "項目1の値", "1", "2", "3", "4" }; 53 string[] c6kou2 = new string[] { "項目2の値", "5", "6", "7", "8" }; 54 string[] c6kou3 = new string[] { "項目3の値", "9", "10", "11", "12" }; 55 56 for (int i = 0; i < strtext.Length; i++) 57 { 58 switch (strtext[i]) 59 { 60 case kou1: 61 comboBox6.Items.Clear(); 62 comboBox6.Items.AddRange(c6kou1); 63 comboBox6.Text = c6kou1[0]; 64 break; 65 case kou2: 66 comboBox6.Items.Clear(); 67 comboBox6.Items.AddRange(c6kou2); 68 comboBox6.Text = c6kou2[0]; 69 break; 70 case kou3: 71 comboBox6.Items.Clear(); 72 comboBox6.Items.AddRange(c6kou3); 73 comboBox6.Text = c6kou3[0]; 74 break; 75 default: 76 break; 77 } 78 } 79 } 80 }

補足情報(FW/ツールのバージョンなど)

2列目のcomboBoxのTextChangedイベントに上記select_cbxを入れてます。
よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2019/12/18 05:22

ご自身のプログラムがどういう動作を行っているかデバッガで確認しましたか?
guest

回答1

0

ベストアンサー

コンボボックスの順番が分かりにくかったので変えています。
comboBox1 comboBox5 comboBox6
comboBox2
comboBox3
comboBox4

項目名と値が離れていて管理しにくそうなのでDictionaryにしました。

cs

1using System; 2using System.Collections.Generic; 3using System.Data; 4using System.Linq; 5using System.Windows.Forms; 6 7namespace Questions230267 8{ 9 public partial class Form1 : Form 10 { 11 private readonly ComboBox[] itemComboBoxes; 12 private readonly Dictionary<string, string[]> itemDict = new Dictionary<string, string[]> 13 { 14 { "項目1", new string[]{ "項目1の値", "1", "2", "3", "4" } }, 15 { "項目2", new string[]{ "項目2の値", "5", "6", "7", "8" } }, 16 { "項目3", new string[]{ "項目3の値", "9", "10", "11", "12" } }, 17 }; 18 19 20 public Form1() 21 { 22 InitializeComponent(); 23 24 // デザイナで指定してよい ここから 25 comboBox1.Name = "コンボ1"; 26 comboBox2.Name = "コンボ2"; 27 comboBox3.Name = "コンボ3"; 28 comboBox4.Name = "コンボ4"; 29 comboBox1.TextChanged += ComboBox_TextChanged; 30 comboBox2.TextChanged += ComboBox_TextChanged; 31 comboBox3.TextChanged += ComboBox_TextChanged; 32 comboBox4.TextChanged += ComboBox_TextChanged; 33 comboBox5.TextChanged += ComboBox_TextChanged; 34 comboBox6.DropDownStyle = ComboBoxStyle.DropDownList; 35 // デザイナで指定してよい ここまで 36 37 38 itemComboBoxes = new ComboBox[] { comboBox1, comboBox2, comboBox3, comboBox4 }; 39 40 var strsSource = itemDict.Keys.ToArray(); 41 foreach(var combo in itemComboBoxes) 42 { 43 combo.Items.Add(combo.Name); 44 combo.Items.AddRange(strsSource); 45 combo.SelectedIndex = 0; 46 } 47 48 comboBox5.Items.AddRange(itemComboBoxes.Select(x => x.Name).ToArray()); 49 } 50 51 private void ComboBox_TextChanged(object sender, EventArgs e) 52 { 53 comboBox6.Items.Clear(); 54 var combo = itemComboBoxes.FirstOrDefault(x => x.Name == comboBox5.Text) as ComboBox; 55 var item = combo?.Text; 56 if(!string.IsNullOrEmpty(item) && itemDict.ContainsKey(item)) 57 { 58 comboBox6.Items.AddRange(itemDict[item]); 59 comboBox6.SelectedIndex = 0; 60 } 61 } 62 } 63}

文字を入力できるようにする(DropDownStyle = ComboBoxStyle.DropDown)のは必須条件でしょうか?(使い分けてるようなのでそうなんでしょうが)
TextChangedですと選択値と表示がずれたりして扱いづらかったです^^;

投稿2019/12/18 08:48

編集2023/07/17 12:44
TN8001

総合スコア9319

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/12/18 23:42

出来ました。 説明するgifアニメを作るのにDropDownにして初期値を記入していました。実際のコードはDropDownListにしています。また、イベントもTextChangedとSelectedIndexChangedしか思いつかなかったのでTextChangedを使って作っていました。 TN8001さんのコードを参考に学習させてもらいます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問