如何创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绑定到具有Name
和Value
属性的对象列表。
然后,可以将ComboBox的[ DisplayMember
属性设置为Name
, ValueMember
属性设置为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;