2009-12-11 189 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")