如何创build一个带有标签和值的Winformscombobox?

我主要是一个ASP.NET开发人员,但我正在一个WinForms应用程序,并注意到ASP.NETcombobox(HTMLselect)和WinForms。 我发现(也许是不正确的),WinForm的combobox只有一个“标签”,而ASP.NET允许你指定一个“标签”和“价值”。

我正在寻找使用WinFormscombobox(或其他类似的控件)与标签和值(Foobar / 42329)。 这可能吗? 我试图寻找答案,但没有提出太多。 如果没有办法做到这一点,那么如何devise一个WinFormcombobox来代表城市及其关联的数据库ID呢?

  • 多伦多/ 2324
  • 蒙特利尔/ 64547
  • 温哥华/ 1213

我可以想到几个方法:

  • 覆盖City类的ToString()return Name + " / " + Id;
  • 同上,但与TypeConverter
  • 添加一个返回相同的DisplayText属性,并使用DisplayMember
  • 为数据build立一个Shim类

对于最后一个:

 var data = cities.Select(city => new { Id = city.Id, Text = city.Name + " / " + city.Id }).ToList(); cbo.ValueMember = "Id"; cbo.DisplayMember = "Text"; cbo.DataSource = data; 

假设您的值是唯一的,您可以先填充一个字典,然后将combobox绑定到字典。 不幸的是,数据绑定需要一个IList或一个IListSource,所以你必须把它包装在Binding Source中。 我在这里find了解决scheme。

  private void PopulateComboBox() { var dict = new Dictionary<int, string>(); dict.Add(2324, "Toronto"); dict.Add(64547, "Vancouver"); dict.Add(42329, "Foobar"); comboBox1.DataSource = new BindingSource(dict, null); comboBox1.DisplayMember = "Value"; comboBox1.ValueMember = "Key"; } 

您可以尝试创build一个名为ComboBoxItem小类,如下所示:

 public class ComboBoxItem<T> { public string Label { get; set; } public T Value { get; set; } public override string ToString() { return Label ?? string.Empty; } } 

然后,当你需要得到一个对象时,只需将其投射到一个ComboBoxItem

可以通过设置其DataSource属性将ComboBox绑定到对象集合。

默认情况下,SelectedValue属性将被赋予被选中的对象,列表将调用每个对象的ToString并显示结果。
但是,如果您设置了combobox的DisplayMember属性,它将在列表中显示DisplayMember中指定的属性的值。 同样,您可以设置ComboBox的ValueMember属性,而SelectedValue proeprty将返回由ValueMember命名的属性的值。


因此,您需要将ComboBox绑定到具有NameValue属性的对象列表。
然后,可以将ComboBox的[ DisplayMember属性设置为NameValueMember属性设置为Value

编辑 :你也可以调用Add方法,并给它一个这样的对象,而不是数据绑定。 或者,您可以将它绑定到List<T>或数组。

有一个名为DisplayMember的属性,其值将用于显示, ValueMember是用于该值的属性。

  anestezi.DisplayMember = "Text"; anestezi.ValueMember = "Value"; anestezi.DataSource = new[] { new { Text = "Genel", Value = "G" }, new { Text = "Lokal", Value = "L" }, new { Text = "Sedasyon", Value = "S" } }; anestezi.SelectedIndex = 0;