如何在ComboBox中存储显示值和实际值?
即,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的选定项目的字典,但最终会根据需要返回字符串。
为了解决上述问题,修复方法是在数据源之前设置DisplayMember和ValueMember属性。我认为这是一个错误。 代码应为:
this.options_filterby.DisplayMember = "Key";
this.options_filterby.ValueMember = "Value";
this.options_filterby.DataSource = new BindingSource(filterItems, null);
答案 0 :(得分:9)
ComboBox.Items集合存储 object 类型的值。所以它可以存储你想要的任何类型。它从对象的ToString()方法生成 display 值。要获取 real 值,只需将对象强制转换为类的类型。
答案 1 :(得分:7)
您可以使用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
,则会返回实际的项目,如果您未设置DisplayMember
,则会使用项ToString()
方法获取字符串给用户。
我不确定这是否会起作用,或者它是否会改变你所拥有的,但你至少可以尝试:)
问题是,我不确定BindingSource在获取字典作为其数据源时会做什么。我认为它将它视为IEnumerable<KeyValuePair<>>
,所以你的代码应该可以工作,但是,它没有,所以也许这会...... [/ p>
BindingSource source = new BindingSource();
source.DataSource = typeof(KeyValuePair<string, string>);
foreach (KeyValuePair<string, string> pair in filterItems) {
source.Add(pair);
}
options_filterby = source;