这个问题已经在这里有了答案:




已关闭8年。






一种方法将如何在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);
    

    最佳答案

    您可以使用DisplayMemberValueMember来确定ComboBox将显示什么以及从SelectedValue返回什么。设置DataSource属性时,ComboBox将使用DisplayMember描述的属性将字符串呈现给用户。

  • DataSource
  • DisplayMember
  • ValueMember


  • 像这样
    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;
    

    08-27 15:12