2009-12-11 128 views
5

如何在Visual Basic 2010中将每个项目的数据值添加到组合框中?如何在组合框中添加值

像html下拉框一样。

或者无论如何增加每个项目的价值?

我从MySQL数据库添加项目是这样的:

Command = New MySqlCommand("SELECT * FROM `maillist` WHERE l_id = '" & id & "'", connection) 

Command.CommandTimeout = 30 
Reader = Command.ExecuteReader() 
If Reader.HasRows = True Then 
    While Reader.Read() 
     ComboBox1.Items.Add(Reader("name")) 
    End While 
End If 

我需要添加Reader("ID")作为每个项目的价值...

回答

9

如果你想使用SelectedValue,那么你的组合框必须是数据绑定。

要设置组合框:

ComboBox1.DataSource = GetMailItems() 
ComboBox1.DisplayMember = "Name" 
ComboBox1.ValueMember = "ID" 

获取数据:

Function GetMailItems() As List(Of MailItem) 

    Dim mailItems = New List(Of MailItem) 

    Command = New MySqlCommand("SELECT * FROM `maillist` WHERE l_id = '" & id & "'", connection) 
    Command.CommandTimeout = 30 
    Reader = Command.ExecuteReader() 

    If Reader.HasRows = True Then 
     While Reader.Read() 
      mailItems.Add(New MailItem(Reader("ID"), Reader("name"))) 
     End While 
    End If 

    Return mailItems 

End Function 

Public Class MailItem 

    Public Sub New(ByVal id As Integer, ByVal name As String) 
     mID = id 
     mName = name 
    End Sub 

    Private mID As Integer 
    Public Property ID() As Integer 
     Get 
      Return mID 
     End Get 
     Set(ByVal value As Integer) 
      mID = value 
     End Set 
    End Property 

    Private mName As String 
    Public Property Name() As String 
     Get 
      Return mName 
     End Get 
     Set(ByVal value As String) 
      mName = value 
     End Set 
    End Property 

End Class 
+0

在vb.net 2015 dosen't work :( – Rinos 2017-06-22 13:05:09

1

而不是增加Reader("Name")你添加一个新的ListItem的。 ListItem有一个Text和一个Value属性,您可以设置。

+0

你的意思列表框?对不起,我不明白,你能告诉我简短的例子吗? – 2009-12-11 11:32:24

14

我假设你是想将项目添加到组合框的Windows窗体上。虽然Klaus在正确的轨道上,我相信ListItem类是System.Web.UI.WebControls命名空间的成员。所以你不应该在Windows窗体解决方案中使用它。但是,您可以创建自己的班级,您可以使用它。 创建一个名为MyListItem(或任何名称你选择),这样简单的类:

Public Class MyListItem 
    Private mText As String 
    Private mValue As String 

    Public Sub New(ByVal pText As String, ByVal pValue As String) 
     mText = pText 
     mValue = pValue 
    End Sub 

    Public ReadOnly Property Text() As String 
     Get 
      Return mText 
     End Get 
    End Property 

    Public ReadOnly Property Value() As String 
     Get 
      Return mValue 
     End Get 
    End Property 

    Public Overrides Function ToString() As String 
     Return mText 
    End Function 
End Class 

现在,当您想将项目添加到您的组合框,你可以做这样的:

myComboBox.Items.Add(New MyListItem("Text to be displayed", "value of the item")) 

现在当你想要从你的ComboBox中所选项目的值,你可以做这样的:

Dim oItem As MyListItem = CType(myComboBox.SelectedItem, MyListItem) 
MessageBox.Show("The Value of the Item selected is: " & oItem.Value) 

的关键之一这里覆盖的ToString方法类。这是ComboBox获取显示的文本的位置。


Matt在下面的评论中提到了使用泛型使其更加灵活的优点。所以我想知道会是什么样子。

这里是新的和改进GenericListItem类:

Public Class GenericListItem(Of T) 
    Private mText As String 
    Private mValue As T 

    Public Sub New(ByVal pText As String, ByVal pValue As T) 
     mText = pText 
     mValue = pValue 
    End Sub 

    Public ReadOnly Property Text() As String 
     Get 
      Return mText 
     End Get 
    End Property 

    Public ReadOnly Property Value() As T 
     Get 
      Return mValue 
     End Get 
    End Property 

    Public Overrides Function ToString() As String 
     Return mText 
    End Function 
End Class 

这里是你会怎么现在通用的项目到您的组合框添加。在这种情况下,一个整数:

Me.myComboBox.Items.Add(New GenericListItem(Of Integer)("Text to be displayed", 1)) 

而现在该项目的检索:

Dim oItem As GenericListItem(Of Integer) = CType(Me.myComboBox.SelectedItem, GenericListItem(Of Integer)) 
MessageBox.Show("The value of the Item selected is: " & oItem.Value.ToString()) 

记住类型Integer可以是任何类型的对象或值类型的。如果你想让它成为你自己的自定义类中的一个对象,那很好。基本上任何事情都会采用这种方法。

+0

+1很好的答案: - 更好的使'mValue'是一个泛型类型'T'而不是'String',那么你可以使用'Enum','Integer '等等你的价值 – 2013-04-10 18:50:46

10

虽然这个问题是5岁,我遇到了一个很好的解决方案。

使用'DictionaryEntry'对象来配对键和值。

设置 'DisplayMember' 和 'ValueMember' 属性:

Me.myComboBox.DisplayMember = "Key" 
    Me.myComboBox.ValueMember = "Value" 

要将项目添加到组合框:

Me.myComboBox.Items.Add(New DictionaryEntry("Text to be displayed", 1)) 

中检索的项目是这样的:

MsgBox(Me.myComboBox.SelectedItem.Key & " " & Me.myComboBox.SelectedItem.Value) 
+0

非常好,非常简单,谢谢你支付,继续扫描下来的答案 – 2016-02-04 21:14:52

+0

非常好,现在如何改变选择的项目,如果我只有钥匙? – 2016-09-08 21:45:25

+0

迭代通过项目使用对于...每个循环。检查项目。钥匙 http://stackoverflow.com/questions/32100580/find-if-value-contains-a-string-in-a-drop-down-list-in- vb-net – 2016-09-10 20:30:39

0

是的,在大多数情况下,你不需要用getter和setter创建一个类。只需创建一个新的字典并将其绑定到数据源。下面是一个使用for循环从列表中设置组合框将DisplayMember和ValueMember在VB的例子:根据你需要什么,通过调用值或

 Dim comboSource As New Dictionary(Of String, String)() 
     cboMenu.Items.Clear() 
     For I = 0 To SomeList.GetUpperBound(0) 
      comboSource.Add(SomeList(I).Prop1, SomeList(I).Prop2) 
     Next I 
     cboMenu.DataSource = New BindingSource(comboSource, Nothing) 
     cboMenu.DisplayMember = "Value" 
     cboMenu.ValueMember = "Key" 

然后你就可以建立一个数据网格视图中的行上点击的方法:

Private Sub cboMenu_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboMenu.SelectionChangeCommitted 
    SetListGrid(cboManufMenu.SelectedValue) 
End Sub 
0

现在你可以使用insert方法,而不是add

' Visual Basic 
CheckedListBox1.Items.Insert(0, "Copenhagen")