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