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

时间:2010-01-07 20:10:59

标签: .net winforms combobox

我主要是一名ASP.NET开发人员,但我正在开发一个WinForms应用程序,并注意到ASP.NET组合框(html select)和WinForms之间存在很大差异。我发现(可能不正确)WinForm的组合框只有一个“标签”,而ASP.NET允许你指定一个“标签”和一个“值”。

我希望使用带有标签和值(Foobar / 42329)的WinForms组合框(或其他类似控件)。这可能吗?我试图寻找答案,但没有提出太多。如果没有办法实现这一点,那么如何设计一个WinForm组合框来表示具有相关数据库ID的城市?

  • 多伦多/ 2324
  • Montreal / 64547
  • 温哥华/ 1213

6 个答案:

答案 0 :(得分:49)

我可以想到几个方法:

  • ToString()课程的City覆盖为return Name + " / " + Id;
  • 同上,但TypeConverter
  • 添加返回相同的DisplayText属性,然后使用DisplayMember
  • 为数据构建一个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;

答案 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绑定到具有NameValue属性的对象列表。
然后,您可以将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;