带文本和值的C#ComboBox

可能重复:
C#Winforms Combobox带有标签和值

如何在ComboBox中存储显示值和实际值?

即,ComboBox显示:

  • 毁灭世界
  • 火弹弓
  • 召唤克苏鲁

但检索到的值是:

  • DW
  • SS
  • SC

我希望能够以类似于此的方式检索所选项的值:

string selectedValue = combobox1.SelectedValue 

更新了代码以回答答案:

 Dictionary filterItems = new Dictionary { {"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); 

ComboBox.Items集合存储object类型的值。 所以它可以存储你想要的任何类型。 它从对象的ToString()方法生成显示值。 要获得真实值,只需将对象强制转换为类的类型即可。

您可以使用DisplayMemberValueMember来确定ComboBox将显示的内容以及从SelectedValue返回的内容。 设置DataSource属性时,ComboBox将使用DisplayMember描述的属性向用户呈现字符串。

  • 数据源
  • DisplayMember
  • ValueMember

像这样的东西

 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 ,则将使用ToString()方法获取呈现给用户的字符串。


我不确定这是否会起作用,或者它是否可以改变你所拥有的,但你至少可以尝试:)事情是,我不确定BindingSource在获取字典作为其数据源时的作用。 我认为它将它视为IEnumerable> ,所以你的代码应该可以工作,但是,它没有,所以也许这会……

 BindingSource source = new BindingSource(); source.DataSource = typeof(KeyValuePair); foreach (KeyValuePair pair in filterItems) { source.Add(pair); } options_filterby = source;