22

重複の可能性:
C# Winforms Combobox with Label and Value

ComboBox に表示値と実際の値を格納するには、どのようにアプローチすればよいでしょうか?

つまり、ComboBox には次のように表示されます。

  • デストロイワールド
  • ファイアスリングショット
  • クトゥルフ召喚

ただし、取得される値は次のとおりです。

  • dw
  • ss
  • sc

次のような方法で、選択した項目の値を取得できるようにしたいと考えています。

string selectedValue = combobox1.SelectedValue

回答に応じて更新されたコード:

Dictionary<string, string> filterItems = new Dictionary<string, string>
{
    {"Destroy World", "dw"},
    {"Fire Slingshot", "fs"},
    {"Summon Cthulu", "sc"},
};
this.options_filterby.DataSource = new BindingSource(filterItems, null);
this.options_filterby.DisplayMember = "Key";
this.options_filterby.ValueMember = "Value";

何らかの理由で、DisplayMembers はまったく問題ありませんが、ValueMembers はディクショナリ オブジェクトを返します。さらに奇妙なことに、しばらくすると、最終的に ValueMembers は期待どおりに文字列を返します。

private void options_filterby_SelectedIndexChanged(object sender, EventArgs e)
{
    MessageBox.Show(options_filterby.SelectedValue.ToString());
}

これは、ComboBox の選択した項目を変更した最初の数回は辞書を返しますが、最終的には必要に応じて文字列を返します。

更新:修正済み(質問がクローズされたため、解決策として追加できません)

上記の問題に対する修正は、DataSource の前にDisplayMember および ValueMember プロパティを設定することです。これはバグだと思います。コードは次のようになります。

this.options_filterby.DisplayMember = "Key";
this.options_filterby.ValueMember = "Value";
this.options_filterby.DataSource = new BindingSource(filterItems, null);
4

2 に答える 2

12

DisplayMemberとを使用しValueMemberて、ComboBox が表示するものと から返されるものを決定しSelectedValueます。プロパティを設定するDataSourceと、ComboBox は で記述されたプロパティを使用しDisplayMemberて文字列をユーザーに表示します。


このようなもの

public class Item {
  string Name { get; set; }
  string Value { get; set; }
}

ComboBox box = new ComboBox();
box.DisplayMember = "Name";
box.ValueMember = "Value";
box.DataSource = new [] { new Item() { "Test", "test" } };

設定しない場合ValueMemberは代わりに実際の Item が返され、設定しない場合DisplayMemberは itemsToString()メソッドを使用してユーザーに表示される文字列が取得されます。


これが機能するかどうか、またはあなたが持っているものを変更する可能性があるかどうかはわかりませんが、少なくとも試してみることができます:)問題は、データソースとして辞書を取得したときに BindingSource が何をするかわかりません。私はそれをしかしとして扱うと思うIEnumerable<KeyValuePair<>>ので、あなたのコードはうまくいくはずですが、うまくいかないので、おそらくこれは..

BindingSource source = new BindingSource();
source.DataSource = typeof(KeyValuePair<string, string>);
foreach (KeyValuePair<string, string> pair in filterItems) {
    source.Add(pair);
}
options_filterby = source;
于 2012-04-08T13:04:58.350 に答える
9

ComboBox.Itemsコレクションは、オブジェクト型の値を格納します。だからそれはあなたが望むどんな種類のタイプも保存することができます。オブジェクトのToString()メソッドから表示値を生成します。実際の値を取得するには、オブジェクトをクラスのタイプにキャストするだけです。

于 2012-04-08T12:50:46.297 に答える