带文本和值的C#ComboBox

时间:2012-04-08 12:31:47

标签: c# winforms combobox

  

可能重复:
  C# Winforms Combobox with Label and Value

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

即,ComboBox显示:

  • 毁灭世界
  • Fire Slingshot
  • Summon Cthulhu

但检索到的值是:

  • 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的选定项目的字典,但最终会根据需要返回字符串。

更新:已修复(由于问题已关闭,无法添加为解决方案)

为了解决上述问题,修复方法是在数据源之前设置DisplayMember和ValueMember属性。我认为这是一个错误。 代码应为:

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

2 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:7)

您可以使用DisplayMemberValueMember来确定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;