1

假设您有一个相当小的项目序列,其中每个项目都有属性: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 中设置什么?

4

1 回答 1

1

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

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

在我的显示项目 ID 的组合框示例中:

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

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

谢谢查理脸!

于 2021-01-07T15:11:10.363 回答