为ComboBox项分配值

时间:2015-08-02 23:33:54

标签: .net vb.net winforms combobox

我正在尝试为winform的货币制作一个投递箱(Combobox)。这是我到目前为止所做的:

Screen grab of combobox input

但我注意到下拉框的Databound版本有一个特殊选项。所以我想知道是否有可能创建类似于此的东西而不需要对整个字符串进行比较或在数据库中创建表。

Screen shot of combobox tasks

1 个答案:

答案 0 :(得分:2)

List和Comboboxes可以包含对象而不是简单的字符串。您可以将List(Of T)(以及其他)设置为DataSource,而不是在Designer中定义内容。这允许您显示一件事但是获取不同的东西,例如返回值。

这非常有用,有一个简单的NameValuePair类将值或代码转换为用户友好的东西并不罕见:

Public Class NVP
    Public Property Name As String
    Public Property Value As Integer

    Public Sub New(n As String, v As Integer)
        Name = n
        Value = v
    End Sub

    ' what these will display using .ToString:
    Public Overrides Function ToString() As String
        Return String.Format("{0} ({1})", Name, Value.ToString)
    End Function
End Class

然后代码创建这些列表并将其用作组合的源:

Private myAList As List(Of NVP)
...
myAList = New List(Of NVP)

myAList.Add(New NVP("ziggy", 26))
myAList.Add(New NVP("able", 1))
myAList.Add(New NVP("charlie", 3))
myAList.Add(New NVP("echo", 5))

ComboBox1.DataSource = myAList
ComboBox1.DisplayMember = "Name"    ' property name to show the user
ComboBox1.ValueMember = "Value"     ' property name to use as the value

然后,使用它:

Console.WriteLine("Selection Changed! Item: {0}  Value: {1}",
                   ComboBox1.SelectedItem.ToString,
                   ComboBox1.SelectedValue.ToString)

输出:

  

选择改变了!项目:ziggy(26)价值:26
  选择改变了!项目:查理(3)价值:3
  选择改变了!货号:able(1)价值:1

备注:
NameValuePair类的好处是它将数据保存在一起(并且易于访问),而不是作为不同数组中的单独项目。

使用DataSource的主要好处是您无需复制数据。 Name不是将列表中的Items值复制到List/ComboBox集合,而是使用代码所用的相同的

SelectedItem会返回一个NVP对象(.Items(n)也是如此),但它们会以Object的形式返回,因此您需要将其转发回NameValuePair才能访问任何属性:

thisItem = CType(ComboBox1.SelectedItem, NVP)
Console.WriteLine(thisItem.Name)

SelectedItem.ToString在我们的Type上调用ToString方法。它可能只是打印Name或任何你想要的。

如果列表是动态的 - 会添加和/或删除它 - 那么您可能希望使用BiningList(of T)。对列表的更改将自动显示在控件中(ListBoxComboBoxDatagridView)。

如果列表项目是动态的 - {" ziggy",26}可能会更改为{" zulu",98},那么您的项目类应该实现INotifyPropertyChanged,以便这些更改也会自动显示在UI控件中。