【问题标题】:ComboBox datasource: show complete itemComboBox 数据源:显示完整的项目
【发布时间】:2023-03-24 19:57:01
【问题描述】:

假设您有一个相当小的项目序列,其中每个项目都有属性:ID 和名称。
Id 和 Name 是唯一的。
您希望像组合框一样在 ListControl 中显示项目。
您只想显示项目的名称,而不是 ID。
选择显示的项目的名称时,您希望项目的 Id 作为选定值:

这可以通过设置属性 DisplayMember 和 ValueMember 使用 DataSource 轻松完成

IList<Item> items = ...
this.ComboBox1.DataSource = items;
this.ComboBox1.DisplayMember = nameof(Item.Name);
this.ComboBox1.ValueMember = nameof(Item.Id)

当项目被选中时:

int selectedId = (int) this.ComboBox1.SelectedValue;

您可以通过 Id 选择一个项目:

Item item = ...
this.ComboBox.SelectedValue = item.Id;

然后,项目的名称就会显示出来。

但是现在我有一个没有属性的项目序列,例如一个枚举:

IList<MyEnum> enums = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().ToList();
this.comboBox1.DataSource = enums;

这足以在组合框中显示枚举。无需设置 DisplayMember / ValueMember。 我可以得到选定的枚举:

MyEnum e = (MyEnum)this.ComboBox1.SelectedValue;

但我无法设置:

MyEnum e = ...
this.ComboBox1.SelectedValue = e;

导致异常:System.InvalidOperationException: '无法在具有空 ValueMember 的 ListControl 中设置 SelectedValue。'

那么我应该在 ValueMember 中设置什么?

【问题讨论】:

  • 使用SelectedItem = e
  • 天哪,就这么简单!

标签: c# data-binding combobox listcontrol


【解决方案1】:

CharlieFace 提出了以下解决方案,并且成功了:

private MyEnum SelectedEnum
{
    get => (MyEnum)this.comboBox1.SelectedItem;
    set => this.comboBox1.SelectedItem = value;
}

在我的显示项目 ID 的 ComboBox 示例中:

private Item SelectedItem
{
    get => (Item)this.comboBox1.SelectedItem;
    set => this.comboBox1.SelectedItem = value;
}

所以即使只显示了项目的名称; SelectedItem 包含数据源的完整项。

感谢 CharlieFace!

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 1970-01-01
    • 2011-09-20
    • 2013-07-14
    • 1970-01-01
    • 2023-03-12
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多