C#带文本和值的ComboBox

22

可能是重复问题:
C# Winforms带标签和值的ComboBox

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

例如,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属性。我认为这是一个bug。代码应该如下:

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

4
WinForms、WPF、Silverlight或ASP.NET? - ChrisF
1
你能发布一下代码示例吗? - walther
Visual Studio .NET 表单 - Chris Watts
你怎么知道 DestroySlingShotCthulhu 这些东西会被检索出来?你的问题不够清晰,基础是什么? - John Woo
1
链接中的字典答案正是我所需要的,谢谢。 - Chris Watts
1
尽管这被标记为重复,但我更喜欢你问题中的修复方法。谢谢。 - 101010
2个回答

13
你可以使用 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<>>,所以您的代码应该可以工作,但实际上并没有,因此也许这个可以解决问题。

BindingSource source = new BindingSource();
source.DataSource = typeof(KeyValuePair<string, string>);
foreach (KeyValuePair<string, string> pair in filterItems) {
    source.Add(pair);
}
options_filterby = source;

我正在使用的答案(与您的类似)在https://dev59.com/03I-5IYBdhLWcg3wFkKO上做了一些奇怪的事情。ComboBox显示正确的项目,但是在我使用box.SelectedValue在SelectedIndexChanged事件中的前3次时,它返回一个字典对象,最后才返回字典的Value部分。有什么想法吗? - Chris Watts
@CJxD:SelectedValue不能先返回一个字典,然后再返回一个值。您能解释一下这个声明的含义吗?此外,您能否提供一些信息(可能需要编辑您的问题),以包括您如何设置DataSource集合? - Patrick
基本上它会在几秒钟后自行修复。设置box.ValueMember是否有延迟或其他问题? - Chris Watts
你能否发布一下用于填充组合框的代码,以及由SelectedIndexChanged处理程序调用的代码? - XIVSolutions
1
@Patrick,看到问题的其余部分了吗?我找到了解决方法 =] - Chris Watts
显示剩余2条评论

9

ComboBox.Items 集合存储类型为 object 的值,因此它可以存储任何一种你想要的类型。它通过对象的 ToString() 方法生成 显示 值。要获取 实际 值,只需将对象强制转换为你的类的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接