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

nok*_*nal 37 .net combobox winforms

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

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

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

Mar*_*ell 49

我可以想到几个方面:

  • 覆盖ToString()一个Cityreturn 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;
Run Code Online (Sandbox Code Playgroud)

  • @Arbiter是的,我知道; 我只想表达清楚......当我重命名时避免意外; p (5认同)
  • 我不知道组合框是如此强大......我使用这个解决方案,因为我也是Linq newb并且决定走这条路.Stackoverflow规则,谢谢你们! (2认同)

Jam*_*Ide 38

假设您的值是唯一的,您可以先填充字典然后将组合框绑定到字典.不幸的是,数据绑定需要IList或IListSource,因此您必须将其包装在Binding Source中.我在这里找到了解决方案.

    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";
    }
Run Code Online (Sandbox Code Playgroud)

  • 在定义DataSource之前,需要分配DisplayMember和ValueMember (3认同)

小智 6

您可以尝试创建一个名为的小类ComboBoxItem,如下所示:

public class ComboBoxItem<T>
{
    public string Label { get; set; }
    public T Value { get; set; }

    public override string ToString()
    {
        return Label ?? string.Empty;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后当你需要获得一个对象时,只需将其转换为一个对象ComboBoxItem.

  • 他正在重写"ToString",因此它永远不会为空. (2认同)

SLa*_*aks 5

可以通过设置其属性将 ComboBox 绑定到对象集合DataSource

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


Name因此,您需要将 ComboBox 绑定到具有和属性的对象列表Value
然后,您可以将 ComboBox 的 [DisplayMember属性设置为Name,并将ValueMember属性设置为Value

编辑:您还可以调用该Add方法并为其提供这样的对象而不是数据绑定。或者,您可以将其绑定到 aList<T>或数组。