22

可能重复:
带有标签和值的 C# Winforms 组合框

一种方法如何在 ComboBox 中存储显示值和实际值?

即,组合框显示:

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

但检索到的值为:

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

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

针对上述问题,修复方法是在DataSource之前设置DisplayMember和ValueMember属性。我认为这是一个错误。代码应为:

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

2 回答 2

12

您使用DisplayMemberandValueMember来确定 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,则 itemsToString()方法将用于获取呈现给用户的字符串。


我不确定这是否可行,或者它是否会改变你所拥有的,但你至少可以尝试一下:) 问题是,我不确定当 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;
于 2012-04-08T13:04:58.350 回答
9

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

于 2012-04-08T12:50:46.297 回答