NightElf00
@NightElf00

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

コンボボックスに選択肢を正しく追加されない

Q&A

Closed

解決したいこと

コンボボックスに 値 と 表示名 を入れたいです。
選択肢が合計4つがあります。
うまく追加されないので、私のソースコードはどこが間違っているかを知りたいです。

該当するソースコード

    // コンボボックス表示用クラス
    private class ComboBoxDataSource
    {
        /// <summary>
        /// データ
        /// </summary>
        public string Value { get; set; }
        /// <summary>
        /// 表示内容
        /// </summary>
        public string DispValue { get; set; }
    }
                
    
    private void SetCombo()
    {            
        ComboBoxDataSource Ptn = new ComboBoxDataSource();        //コンボボックスの選択肢
        List<ComboBoxDataSource> PtnList = new List<ComboBoxDataSource>();        //コンボボックスの選択肢をリスト化

        /*-- コンボボックスの値と表示名を設定 --*/

        string[] ValueArr = { "01", "02", "03", "04" };    //値の配列
        string[] DispValueArr = { "リンゴ", "イチゴ", "オレンジ", "バナナ" };       //表示名の配列
        
        //上記2つの配列をループ文で選択肢として追加する 
        for (int i = 0; i < ValueArr.Length; i++)
        {
            Ptn.Value = ValueArr[i];
            Ptn.DispValue = DispValueArr[i];
            PtnList.Add(Ptn);
        }

        cbo.DataSource = PtnList;
        cbo.ValueMember = "Value";
        cbo.DisplayMember = "DispValue";
    }

期待結果

コンボボックスの選択肢

リンゴ
イチゴ
オレンジ
バナナ

現在の結果

バナナ
バナナ
バナナ
バナナ

自分で試したこと

下記のように修正すれば正しく設定できます。
自分のソースコードの問題はなぜできないかがわかりません。

    // コンボボックス表示用クラス
    private class ComboBoxDataSource
    {
        /// <summary>
        /// データ
        /// </summary>
        public string Value { get; set; }
        /// <summary>
        /// 表示内容
        /// </summary>
        public string DispValue { get; set; }
    }
                
    
    private void SetCombo()
    {            
        //ComboBoxDataSource Ptn = new ComboBoxDataSource();        //コンボボックスの選択肢
        List<ComboBoxDataSource> PtnList = new List<ComboBoxDataSource>();        //コンボボックスの選択肢をリスト化

        /*-- コンボボックスの値と表示名を設定 --*/

        string[] ValueArr = { "01", "02", "03", "04" };    //値の配列
        string[] DispValueArr = { "リンゴ", "イチゴ", "オレンジ", "バナナ" };       //表示名の配列
         
        for (int i = 0; i < ValueArr.Length; i++)
        {
            //コンボボックスをインスタンス化処理をここに置くと、コンボボックスが正しく設定される
            ComboBoxDataSource Ptn = new ComboBoxDataSource();        //コンボボックスの選択肢


            Ptn.Value = ValueArr[i];
            Ptn.DispValue = DispValueArr[i];
            PtnList.Add(Ptn);
        }

        cbo.DataSource = PtnList;
        cbo.ValueMember = "Value";
        cbo.DisplayMember = "DispValue";
    }

よろしくお願いします。

0

2Answer

最初のソースは、List内に追加されたComboBoxDataSourceのインスタンスが全て同じなので、同じ値が表示されています。(インスタンスが共有されているため、最後に変更した"バナナ"が全てのList要素に反映されている)

修正後のソースは、forループ内で都度newでComboBoxDataSourceのインスタンスを作成しているので、List要素内でそれぞれ独立したインスタンスを保持しているため、正しく表示されます。

1Like

Comments

  1. @NightElf00

    Questioner

    なるほど!わかりました。ありがとうございます!

現在のコードでは、同じインスタンスのComboBoxDataSourceオブジェクトをループ内で再利用し、その値を変更しています。そのため、リストに追加されるオブジェクトは、ループの最後に設定された値がすべてのオブジェクトに反映されています。

この問題を解決するには、ループ内で新しいComboBoxDataSourceオブジェクトを作成する必要があります。以下は修正例です。

private void SetCombo()
{            
    List<ComboBoxDataSource> PtnList = new List<ComboBoxDataSource>();    //コンボボックスの選択肢をリスト化

    /*-- コンボボックスの値と表示名を設定 --*/

    string[] ValueArr = { "01", "02", "03", "04" };    //値の配列
    string[] DispValueArr = { "リンゴ", "イチゴ", "オレンジ", "バナナ" };       //表示名の配列
        
    //上記2つの配列をループ文で選択肢として追加する 
    for (int i = 0; i < ValueArr.Length; i++)
    {
        ComboBoxDataSource Ptn = new ComboBoxDataSource();
        Ptn.Value = ValueArr[i];
        Ptn.DispValue = DispValueArr[i];
        PtnList.Add(Ptn);
    }

    cbo.DataSource = PtnList;
    cbo.ValueMember = "Value";
    cbo.DisplayMember = "DispValue";
}

この修正で、期待する結果が得られるはずです。

1Like

Comments

  1. @NightElf00

    Questioner

    丁寧に書いていただきありがとうございました。
    わかりました。ありがとうございました。

Your answer might help someone💌