带文本和值的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()方法生成显示值。 要获得真实值,只需将对象强制转换为类的类型即可。
您可以使用DisplayMember
和ValueMember
来确定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;