

お世話になります。

下記のコードで作成したコンボボックスをフォームに貼り付け、コードがら初期値を  
渡して選択されている項目を変更したかったのですが、なぜかうまくいきません。  
SelectedValueで帰る値はobjectになっているようなので、それが原因なのかと  
思うのですが、途方にくれました。

[code]

    using System;
    using System.Collections.Generic;
    using System.Data;
    
    namespace Easy
    {
        public class UCombo : System.Windows.Forms.ComboBox
        {
            //DataTableオブジェクトを用意
            private DataTable tbl = new DataTable();
    
            public UCombo()
            {
                this.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
    
                //DataTableに列を追加
                this.tbl.Columns.Add("ID", typeof(string));
                this.tbl.Columns.Add("NAME", typeof(string));
    
                this.tbl.AcceptChanges();
    
                //コンボボックスのDataSourceにDataTableを割り当てる
                this.DataSource = this.tbl;
    
                //表示される値はDataTableのNAME列
                this.DisplayMember = "NAME";
    
                //対応する値はDataTableのID列
                this.ValueMember = "ID";
    
                this.clear();
            }
    
            public void clear()
            {
                this.tbl.Clear();
            }
    
            public void add(string val,string disp)
            {
                //新しい行を作成
                DataRow row = this.tbl.NewRow();
    
                //各列に値をセット
                row["ID"] = val;
                row["NAME"] = disp;
    
                //DataTableに行を追加
                this.tbl.Rows.Add(row);
            }
    
        }
    }
    
[/code]

値の取得 string s = SelectedValue;は取得できますが、値の設定 SelectedValue = s;が  
反映されません。

何卒よろしくお願いいたします。


CC BY-SA 4.0
2018-12-08T06:57:04.350
51029
2020-03-20T08:01:20.123
9374
question
c# form
C# ComboBoxでValueMemberとDisplayMemberの設定後に選択項目をコードから指定できません。


こちら
[DataSourceバインドしたらSelectedItemが](http://bbs.wankuma.com/index.cgi?mode=al2&namber=7048&KLOG=18)
を見ると出来ているようですので、  
これ [ComboBox(Forms) の DataSource
を使用するときの注意点](https://netplanetes.wordpress.com/2010/04/20/comboboxforms-%E3%81%AE-
datasource-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9/)
とかが問題なのかもしれません。

> ComboBox.DataSource にデータソースをバインドするときに DisplayMemer,  
>  ValueMemberを事前に設定しておかないと、 SelectedIndexChanged イベントを  
>  サブスクライブしていると痛い目を見ます。DisplayMember, ValueMember を  
>  セットする前に DataSource にバインドすると、 SelectedIndexChanged イベントが  
>  起動されて ComboBox.SelectedValue の値が想定した値(ValueMember) ではなく、  
>  バインドしている現在選択されているオブジェクトそのものになってしまいます。

上記に従って以下の部分を

[code]

            //コンボボックスのDataSourceにDataTableを割り当てる
            this.DataSource = this.tbl;
    
            //表示される値はDataTableのNAME列
            this.DisplayMember = "NAME";
    
            //対応する値はDataTableのID列
            this.ValueMember = "ID";
    
[/code]

こちらのように変えて試してみてください。

[code]

            //表示される値はDataTableのNAME列
            this.DisplayMember = "NAME";
    
            //対応する値はDataTableのID列
            this.ValueMember = "ID";
    
            //コンボボックスのDataSourceにDataTableを割り当てる
            this.DataSource = this.tbl;
    
[/code]

* * *

## 追記

済みません。良く見直したらComboBoxの派生クラスを作成していたんですね。

以下のような感じで同じプロジェクトの中で派生クラスをFormに組み込んでみたら、  
特に変なことも不要で、(object)でキャストすることでSelectedValueを変更出来ています。  
参考にしてください。

Form1.Designer.cs:(Formへの組み込み結果["WindowsFormsApp1"がプロジェクト名])

[code]

        private void InitializeComponent()
        {
            // ～途中省略～
            this.uCombo1 = new WindowsFormsApp1.UCombo();
            // ～途中省略～
            // 
            // uCombo1
            // 
            this.uCombo1.DisplayMember = "NAME";
            this.uCombo1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
            this.uCombo1.FormattingEnabled = true;
            this.uCombo1.Location = new System.Drawing.Point(12, 272);
            this.uCombo1.Name = "uCombo1";
            this.uCombo1.Size = new System.Drawing.Size(160, 20);
            this.uCombo1.TabIndex = 8;
            this.uCombo1.ValueMember = "ID";
            // ～途中省略～
            this.Controls.Add(this.uCombo1);
            // ～途中省略～
        }
        // ～途中省略～
        private UCombo uCombo1;
    
[/code]

Form1.cs:(データの挿入と選択値取得＆変更)

[code]

    public partial class Form1 : Form
    {
        // データの挿入
        private void button1_Click(object sender, EventArgs e)
        {
            uCombo1.add("Value01", "DisplayText01");
            uCombo1.add("Value02", "DisplayText02");
            uCombo1.add("Value03", "DisplayText03");
            uCombo1.add("Value04", "DisplayText04");
            uCombo1.add("Value05", "DisplayText05");
            uCombo1.add("Value06", "DisplayText06");
            uCombo1.add("Value07", "DisplayText07");
            uCombo1.add("Value08", "DisplayText08");
        }
    
        // 選択値取得
        private void button2_Click(object sender, EventArgs e)
        {
            string str = uCombo1.SelectedValue.ToString();
            // ～取得した値の表示処理：省略～
        }
    
        // 選択値変更
        private void button3_Click(object sender, EventArgs e)
        {
            uCombo1.SelectedValue = (object)"Value08";
        }
    }
    
[/code]


CC BY-SA 4.0
2018-12-09T11:01:38.700
51063
2018-12-10T02:01:16.533
2020-06-17T08:14:45.997
-1
26370
51029
answer