这个问题已经在这里有了答案:
已关闭8年。
一种方法将如何在ComboBox中存储显示值和实际值?
即,组合框显示:
但是检索到的值为:
我希望能够以类似于以下方式检索所选项目的值:
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);
最佳答案
您可以使用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
,则将使用items ToString()
方法获取呈现给用户的字符串。我不确定这是否会奏效,或者是否会改变您所拥有的东西,但您至少可以尝试一下:)
问题是,当它获取字典作为其数据源时,我不确定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;