【问题标题】:How do I assign a value to a combo box in VB.NET?如何为 VB.NET 中的组合框赋值?
【发布时间】:2019-10-09 22:21:38
【问题描述】:

我有一个名为cbxType 的组合框项目。 这个组合框填充了:

cbxType.DataSource = [Enum].GetValues(GetType(Customer.CustomerType))

其中Customer.CustomerType 是一个枚举:

Public Enum CustomerType
    Retail
    SelfEmployed
    Company
End Enum

这可以很好地填充字段,但是我如何在稍后的代码中将给定值分配给组合框?

我试过了:

cbxType.ValueMember = 0

但我明白了:

System.ArgumentException: 'Cannot bind to the new display member.
Parameter name: newDisplayMember'

【问题讨论】:

  • 我建议你阅读组合框的属性,你肯定会找到你需要的:)
  • SelectedItem 有效,那么 SelectedValue 有什么区别?
  • 在这种情况下,不多。看到我回答的结尾

标签: vb.net combobox


【解决方案1】:

当 ComboBox 绑定到一些简单实体的集合时,例如枚举 X..

  • 组合中显示的是X.ToString()返回的字符串,在这种情况下返回枚举文本名称,
  • 作为值返回的东西,显示的是组合,是 X。

因此,要更改组合显示的内容,请将组合的 .SelectedValue 设置为 X 类型的对象。在这种情况下,X 将是枚举成员之一:

cbxType.SelectedValue = CustomerType.SelfEmployed

ValueMember(及其合作伙伴DisplayMember)用于指示您希望组合用于显示和选定值的复杂对象的哪个属性。

例如,如果您已将组合绑定到 List(Of Person) 并且 Person 具有 FullName 和 Email 属性等,您可以设置 DisplayMember = "FullName" 以使列表显示“John Smith, Jane Doe..” etc, and you might set a ValueMember = "Email" so when John Smith is selected, calling SelectedValue might return you "John.smith@example.com"

SelectedItem 将是整个 Person 对象。 SelectedIndex 将是所选项目的数字索引,在组合显示的项目列表中,但请记住,在某些情况下,显示的列表可以按与基础集合不同的顺序排序

【讨论】:

  • 以防万一它有助于其他人,如果您使用的是0,那么它将是cbxType.SelectedItem = 0。感谢您的回答,这对我有帮助,并使我走上了使用收藏的轨道。
  • 您确实应该使用枚举成员名称,而不是恰好与枚举成员相关联的整数。枚举不必从 0 开始,如果您重构代码使 Retail 不再为 0(也许您删除了零售但希望将 SelfEmployed 保留为 1 等),那么使用该名称将是编译器错误,您可以修复它.设置 0 将静默编译,但组合将不再选择要开始的项目,因为 0 不再在枚举中 -> 使用枚举名称来利用我们首先使用枚举的全部原因(以避免代码中的幻数)
  • 感谢您的详细说明。使用数字的原因是我使用整数字段将枚举存储在数据库中。
  • 没有问题。在代码中,无论数据如何存储,都应该使用枚举名称。 (还有一些方法可以将字符串名称存储在数据库中,并在取出时将其转换 - 使数据库更具可读性)
猜你喜欢
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多