【问题标题】:How to create a Winforms Combobox with Label and Value?如何创建带有标签和值的 Winforms 组合框?
【发布时间】:2011-01-02 15:48:39
【问题描述】:

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

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

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

【问题讨论】:

标签: .net winforms combobox


【解决方案1】:

我能想到几个办法:

  • City 类的ToString() 覆盖为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;

【讨论】:

  • 我不知道组合框如此强大......我使用了这个解决方案,因为我也是一个 Linq 新手,并决定走这条路。 Stackoverflow 规则,谢谢大家!
  • 看起来有点琐碎,但“Id = city.Id”可以简化为“city.Id”,因为如果未指定,.Net 将使用属性设置器的名称。跨度>
  • @Arbiter 是的,我知道;我只是喜欢明确......当我重命名事物时避免意外;p
  • 琐碎的评论,但我刚刚被咬了 - .ToList() 部分很重要,否则在运行时分配给 DataSource 会失败。
【解决方案2】:

假设您的值是唯一的,您可以先填充字典,然后将组合框绑定到字典。不幸的是,数据绑定需要 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 中做到这一点的,我在编译时没有错误,但在运行时有错误
  • DisplayMember 和 ValueMember 需要在定义 DataSource 之前分配
  • @CJxD 不,不要,至少在 Windows 窗体中是这样。
【解决方案3】:

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

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

    public override string ToString()
    {
        return Label ?? string.Empty;
    }
}

然后当您需要获取一个对象时,只需将其转换为 ComboBoxItem

【讨论】:

  • 你为什么要在字符串上调用ToString
  • 他覆盖了“ToString”,因此它永远不会为空。
【解决方案4】:

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

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


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

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

【讨论】:

  • 有没有办法在没有数据绑定的情况下做到这一点?我正在手动将项目添加到组合框。
  • 如果设置组合框的 ValueMember / DisplayMember 属性,则不需要数据绑定。即使您使用 combobox.Add(yourobject); 它也应该使用它们。问题是您仍然需要一个名称/值对象。
【解决方案5】:

有一个名为DisplayMember 的属性 = 属性名称,其值将用于显示,ValueMember 是用于该值的属性。

【讨论】:

    【解决方案6】:
            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;
    

    【讨论】:

      猜你喜欢
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2014-01-08
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多