ComboBox:アイテムへのテキストと値の追加(バインドソースなし)

2010年06月17日に質問されました。  ·  閲覧回数 858.7k回  ·  ソース

Bohn picture
2010年06月17日

C#WinAppで、ComboBoxのアイテムにテキストと値の両方を追加するにはどうすればよいですか? 私は検索を行い、通常、答えは「ソースへのバインド」を使用しています。しかし、私の場合、プログラムにバインディングソースの準備ができていません...どうすれば次のようなことができますか?

combo1.Item[1] = "DisplayText";
combo1.Item[1].Value = "useful Value"

回答

Adam Markowitz picture
2010年06月18日
368

独自のクラスタイプを作成し、ToString()メソッドをオーバーライドして、必要なテキストを返す必要があります。 使用できるクラスの簡単な例を次に示します。

public class ComboboxItem
{
    public string Text { get; set; }
    public object Value { get; set; }

    public override string ToString()
    {
        return Text;
    }
}

以下は、その使用法の簡単な例です。

private void Test()
{
    ComboboxItem item = new ComboboxItem();
    item.Text = "Item text1";
    item.Value = 12;

    comboBox1.Items.Add(item);

    comboBox1.SelectedIndex = 0;

    MessageBox.Show((comboBox1.SelectedItem as ComboboxItem).Value.ToString());
}
fab picture
2012年08月01日
192
// Bind combobox to dictionary
Dictionary<string, string>test = new Dictionary<string, string>();
        test.Add("1", "dfdfdf");
        test.Add("2", "dfdfdf");
        test.Add("3", "dfdfdf");
        comboBox1.DataSource = new BindingSource(test, null);
        comboBox1.DisplayMember = "Value";
        comboBox1.ValueMember = "Key";

// Get combobox selection (in handler)
string value = ((KeyValuePair<string, string>)comboBox1.SelectedItem).Value;
buhtla picture
2012年10月17日
122

次のような匿名クラスを使用できます。

comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";

comboBox.Items.Add(new { Text = "report A", Value = "reportA" });
comboBox.Items.Add(new { Text = "report B", Value = "reportB" });
comboBox.Items.Add(new { Text = "report C", Value = "reportC" });
comboBox.Items.Add(new { Text = "report D", Value = "reportD" });
comboBox.Items.Add(new { Text = "report E", Value = "reportE" });

更新:上記のコードはコンボボックスに正しく表示されますが、 ComboBox SelectedValueまたはSelectedTextプロパティを使用することはできません。 それらを使用できるようにするには、以下のようにコンボボックスをバインドします。

comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";

var items = new[] { 
    new { Text = "report A", Value = "reportA" }, 
    new { Text = "report B", Value = "reportB" }, 
    new { Text = "report C", Value = "reportC" },
    new { Text = "report D", Value = "reportD" },
    new { Text = "report E", Value = "reportE" }
};

comboBox.DataSource = items;
Mert Cingoz picture
2016年09月28日
36

実行時にコンボボックスアイテムを解決するには、 dynamicオブジェクトを使用する必要があります。

comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";

comboBox.Items.Add(new { Text = "Text", Value = "Value" });

(comboBox.SelectedItem as dynamic).Value
cronynaval picture
2014年11月20日
17

あなたは使用することができますDictionaryにテキストと値を追加するためのカスタムクラスを作成するのではなく、オブジェクトCombobox

Dictionaryオブジェクトにキーと値を追加します。

Dictionary<string, string> comboSource = new Dictionary<string, string>();
comboSource.Add("1", "Sunday");
comboSource.Add("2", "Monday");

ソースDictionaryオブジェクトをComboboxバインドします:

comboBox1.DataSource = new BindingSource(comboSource, null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";

キーと値の取得:

string key = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Key;
string value = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Value;

完全なソース:コンボボックステキストと値

Amr Elgarhy picture
2010年06月18日
15

これはちょうど頭に浮かんだ方法の1つです:

combo1.Items.Add(new ListItem("Text", "Value"))

また、アイテムのテキストや値を変更するには、次のようにします。

combo1.Items[0].Text = 'new Text';

combo1.Items[0].Value = 'new Value';

WindowsフォームにはListItemというクラスはありません。 これはASP.NETにのみ存在するため、@ Adam Markowitzが彼の回答で行ったのと同じように、使用する前に独自のクラスを作成する必要があり

これらのページも確認してください。役立つ場合があります。

ChuckG picture
2012年06月06日
11

これが元の投稿で与えられた状況で機能するかどうかはわかりませんが(これが2年後であるという事実を気にしないでください)、この例は私にとっては機能します:

Hashtable htImageTypes = new Hashtable();
htImageTypes.Add("JPEG", "*.jpg");
htImageTypes.Add("GIF", "*.gif");
htImageTypes.Add("BMP", "*.bmp");

foreach (DictionaryEntry ImageType in htImageTypes)
{
    cmbImageType.Items.Add(ImageType);
}
cmbImageType.DisplayMember = "key";
cmbImageType.ValueMember = "value";

値を読み戻すには、SelectedItemプロパティをDictionaryEntryオブジェクトにキャストする必要があります。その後、そのKeyプロパティとValueプロパティを評価できます。 例えば:

DictionaryEntry deImgType = (DictionaryEntry)cmbImageType.SelectedItem;
MessageBox.Show(deImgType.Key + ": " + deImgType.Value);
Ryan picture
2013年01月31日
7
//set 
comboBox1.DisplayMember = "Value"; 
//to add 
comboBox1.Items.Add(new KeyValuePair("2", "This text is displayed")); 
//to access the 'tag' property 
string tag = ((KeyValuePair< string, string >)comboBox1.SelectedItem).Key; 
MessageBox.Show(tag);
Matheus Rocha picture
2017年04月05日
5

誰かがまだこれに興味を持っているなら、これはテキストと任意のタイプの値を持つコンボボックスアイテムのシンプルで柔軟なクラスです(Adam Markowitzの例に非常に似ています):

public class ComboBoxItem<T>
{
    public string Name;
    public T value = default(T);

    public ComboBoxItem(string Name, T value)
    {
        this.Name = Name;
        this.value = value;
    }

    public override string ToString()
    {
        return Name;
    }
}

<T>を使用すると、 valueobjectとして宣言するよりも優れています。これは、 objectを使用すると、使用したタイプを追跡する必要があるためです。各アイテムをコードにキャストして、適切に使用します。

私はかなり長い間私のプロジェクトでそれを使用しています。 本当に便利です。

Maggie picture
2014年07月18日
4

私はfabの答えが好きでしたが、私の状況に辞書を使いたくなかったので、タプルのリストに置き換えました。

// set up your data
public static List<Tuple<string, string>> List = new List<Tuple<string, string>>
{
  new Tuple<string, string>("Item1", "Item2")
}

// bind to the combo box
comboBox.DataSource = new BindingSource(List, null);
comboBox.ValueMember = "Item1";
comboBox.DisplayMember = "Item2";

//Get selected value
string value = ((Tuple<string, string>)queryList.SelectedItem).Item1;