我主要是一名ASP.NET开发人员,但我正在开发一个WinForms应用程序,并注意到ASP.NET组合框(html select)和WinForms之间存在很大差异。我发现(可能不正确)WinForm的组合框只有一个“标签”,而ASP.NET允许你指定一个“标签”和一个“值”。
我希望使用带有标签和值(Foobar / 42329)的WinForms组合框(或其他类似控件)。这可能吗?我试图寻找答案,但没有提出太多。如果没有办法实现这一点,那么如何设计一个WinForm组合框来表示具有相关数据库ID的城市?
答案 0 :(得分:49)
我可以想到几个方法:
ToString()
课程的City
覆盖为return Name + " / " + Id;
TypeConverter
DisplayText
属性,然后使用DisplayMember
最后:
var data = cities.Select(city => new {
Id = city.Id, Text = city.Name + " / " + city.Id }).ToList();
cbo.ValueMember = "Id";
cbo.DisplayMember = "Text";
cbo.DataSource = data;
答案 1 :(得分:37)
假设您的值是唯一的,您可以先填充字典,然后将组合框绑定到字典。不幸的是,数据绑定需要IList或IListSource,因此您必须将其包装在Binding Source中。我找到了解决方案here。
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";
}
答案 2 :(得分:6)
你可以尝试创建一个名为ComboBoxItem
的小类,如下所示:
public class ComboBoxItem<T>
{
public string Label { get; set; }
public T Value { get; set; }
public override string ToString()
{
return Label ?? string.Empty;
}
}
然后当你需要获得一个对象时,只需将其转换为ComboBoxItem
。
答案 3 :(得分:4)
通过设置其DataSource
属性,可以将ComboBox绑定到对象集合。
默认情况下,SelectedValue属性将为所选对象提供,列表将在每个对象上调用ToString
并显示结果。
但是,如果设置ComboBox的DisplayMember属性,它将在列表中显示DisplayMember中指定的属性的值。同样,您可以设置ComboBox的ValueMember属性,SelectedValue proeprty将返回ValueMember命名的属性的值。
因此,您需要将ComboBox绑定到具有Name
和Value
属性的对象列表。
然后,您可以将ComboBox的[DisplayMember
属性设置为Name
,将ValueMember
属性设置为Value
。
编辑:您也可以调用Add
方法并为其提供此类对象而不是数据绑定。或者,您可以将其绑定到List<T>
或数组。
答案 4 :(得分:1)
有一个名为DisplayMember
=属性名称的属性,其值将用于显示,ValueMember
是用于该值的属性。
答案 5 :(得分:1)
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;