如何使用标签和值创建Winforms组合框?
我主要是一名ASP.NET开发人员,但我正在开发一个WinForms应用程序,并注意到ASP.NET组合框(html选择)与WinForms的区别。我发现(也许不正确),WinForm的组合框只有一个“标签”,而ASP.NET允许你指定一个“标签”和“值”。如何使用标签和值创建Winforms组合框?
我正在寻找使用WinForms组合框(或另一个可比较的控件)的标签和值(Foobar/42329)。这可能吗?我试图寻找答案,但没有提出太多。如果没有办法做到这一点,那么如何设计一个WinForm组合框来代表城市及其关联的数据库ID?
- 多伦多/ 2324
- 蒙特利尔/ 64547
- 温哥华/ 1213
我能想到的几种方法:
- 覆盖一个
City
类return Name + "/" + Id;
- 同上的
ToString()
,但有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;
组合框可以通过设置其属性DataSource
绑定到对象的集合。
默认情况下,SelectedValue属性将给出被选中的对象,并且列表将在每个对象上调用ToString
并显示结果。
但是,如果您设置ComboBox的DisplayMember属性,它将显示列表中DisplayMember中指定属性的值。同样,您可以设置ComboBox的ValueMember属性,并且SelectedValue proeprty将返回由ValueMember命名的属性的值。
因此,你需要将ComboBox绑定到具有Name
和Value
属性的对象的列表。
然后,您可以将组合框的[DisplayMember
属性设置为Name
和ValueMember
属性设置为Value
。
编辑:你也可以调用Add
方法,并给它一个这样的对象,而不是数据绑定。或者,你可以将它绑定到一个List<T>
或一个数组。
有没有办法做到这一点,而无需数据绑定?我手动将项目添加到组合框。 – nokturnal 2010-01-07 20:14:57
combobox.Items.Add – 2010-01-07 20:17:38
如果您设置组合框的ValueMember/DisplayMember属性,则不需要进行数据绑定。即使使用combobox.Add(yourobject),它也应该使用它们;问题在于你仍然需要一个名称/值对象。 – 2010-01-07 20:19:40
你可以尝试创建一个小的类名为ComboBoxItem
,像这样:
public class ComboBoxItem<T>
{
public string Label { get; set; }
public T Value { get; set; }
public override string ToString()
{
return Label ?? string.Empty;
}
}
然后当你需要获得一个对象时,只需将它转换为ComboBoxItem
。
有一个属性叫做DisplayMember
=其值将被用于显示的属性的名称,以及ValueMember
,它是用于该值的属性。
假设您的值是唯一的,您可以先填充字典,然后将组合框绑定到字典。不幸的是,数据绑定需要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";
}
嗨,你在VB中做到这一点,我在编译时没有错误,但是我已经在运行时 – 2010-09-23 12:35:23
DisplayMember错误和ValueMember需要分配前的数据源定义 – CJxD 2012-04-13 08:39:40
@CJxD否不这样做,至少在NIT Windows窗体。 – 2012-04-13 12:47:43
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;
如果你不使用绑定,您可以使用此:http://support.microsoft.com/kb/319946,否则使用榨渣答案。 – 2012-12-10 02:56:50