带文本和值的C#ComboBox

CJx*_*JxD 20 c# combobox winforms

可能重复:
C#Winforms Combobox标签和值

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

即,ComboBox显示:

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

但检索到的值是:

  • DW
  • SS
  • SC

我希望能够以与此类似的方式检索所选项的值:

string selectedValue = combobox1.SelectedValue
Run Code Online (Sandbox Code Playgroud)

更新代码以回答答案:

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";
Run Code Online (Sandbox Code Playgroud)

现在由于某种原因,虽然DisplayMembers绝对正常,但ValueMembers返回字典对象.甚至更奇怪,过了一会儿,最终ValueMembers将按预期返回字符串.

private void options_filterby_SelectedIndexChanged(object sender, EventArgs e)
{
    MessageBox.Show(options_filterby.SelectedValue.ToString());
}
Run Code Online (Sandbox Code Playgroud)

这会返回前几次我更改ComboBox的选定项目的字典,但最终会根据需要返回字符串.

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

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

this.options_filterby.DisplayMember = "Key";
this.options_filterby.ValueMember = "Value";
this.options_filterby.DataSource = new BindingSource(filterItems, null);
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 10

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


Pat*_*ick 8

您可以使用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" } };
Run Code Online (Sandbox Code Playgroud)

如果未设置ValueMember实际的Item,则返回,如果未设置DisplayMember,ToString()则将使用items 方法获取呈现给用户的字符串.


我不确定这是否会起作用,或者它是否可以改变你所拥有的,但你至少可以尝试:)事情是,我不确定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;
Run Code Online (Sandbox Code Playgroud)