如何使用标签和值创建Winforms组合框?

问题描述:

我主要是一名ASP.NET开发人员,但我正在开发一个WinForms应用程序,并注意到ASP.NET组合框(html选择)与WinForms的区别。我发现(也许不正确),WinForm的组合框只有一个“标签”,而ASP.NET允许你指定一个“标签”和“值”。如何使用标签和值创建Winforms组合框?

我正在寻找使用WinForms组合框(或另一个可比较的控件)的标签和值(Foobar/42329)。这可能吗?我试图寻找答案,但没有提出太多。如果没有办法做到这一点,那么如何设计一个WinForm组合框来代表城市及其关联的数据库ID?

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

如果你不使用绑定,您可以使用此:http://support.microsoft.com/kb/319946,否则使用榨渣答案。 – 2012-12-10 02:56:50

我能想到的几种方法:

  • 覆盖一个Cityreturn 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; 
+2

我不知道组合框是如此强大......我利用这个解决方案,因为我也是Linq newb,并决定走这条路。 *规则,谢谢你们! – nokturnal 2010-01-07 20:41:22

+1

似乎有点微不足道,但“Id = city.Id”可以简化为“city.Id”,因为.Net将使用属性设置器的名称(如果没有指定)。 – Arbiter 2012-02-02 20:56:56

+4

@仲裁者是的,我知道;我只是想明确地说......当我重命名事物时避免了意外; p。 – 2012-02-02 20:59:04

组合框可以通过设置其属性DataSource绑定到对象的集合。

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


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

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

+0

有没有办法做到这一点,而无需数据绑定?我手动将项目添加到组合框。 – nokturnal 2010-01-07 20:14:57

+1

combobox.Items.Add – 2010-01-07 20:17:38

+0

如果您设置组合框的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

+0

你为什么在一个字符串上调用'ToString'? – SLaks 2010-01-07 20:29:34

+2

他重写“ToString”,以便它永远不会为空。如何 – EricLaw 2012-09-03 17:11:43

有一个属性叫做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"; 
    } 
+0

嗨,你在VB中做到这一点,我在编译时没有错误,但是我已经在运行时 – 2010-09-23 12:35:23

+3

DisplayMember错误和ValueMember需要分配前的数据源定义 – CJxD 2012-04-13 08:39:40

+0

@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;