【问题标题】:how to add value to combobox item如何为组合框项添加值
【发布时间】:2009-12-11 11:17:41
【问题描述】:

如何在 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") 作为每个项目的值...

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    虽然这个问题已有 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)
    

    【讨论】:

    • 非常好,非常简单。谢谢你。继续扫描答案是值得的。
    • 非常好,现在如果我只有钥匙,如何更改选择的项目?
    • 使用 For...Each 循环遍历项目。检查 Item.Key stackoverflow.com/questions/32100580/…
    • 很好的解决方案,对我帮助很大。只是一个注释。启用 Option Strict 后,您可能会在检索时遇到后期绑定错误。要解决此问题,请使用 CType 来识别所选项目是 Dictionary Entry 类型。示例:CType(Me.myComboBox.SelectedItem,DictionaryEntry).Key
    【解决方案2】:

    我假设您想要将项目添加到 Windows 窗体上的 ComboBox。尽管 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
    

    现在,当您想将项目添加到您的 ComboBox 时,您可以这样做:

    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 类型可以是任何类型的对象或值类型。如果您希望它成为您自己的自定义类之一的对象,那很好。基本上任何事情都适用于这种方法。

    【讨论】:

    • +1 好答案:- 更好地将mValue 设为通用类型Of T 而不是String,然后您可以使用EnumInteger 等作为您的值
    【解决方案3】:

    如果您想使用 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
    

    【讨论】:

      【解决方案4】:

      不是添加Reader("Name"),而是添加一个新的ListItemListItem 具有可以设置的 TextValue 属性。

      【讨论】:

      • 你的意思是列表框?对不起,我没听懂,你能给我看个简短的例子吗?
      【解决方案5】:

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

              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
      

      【讨论】:

        【解决方案6】:

        现在您可以使用insert 方法代替add

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

        【讨论】:

        • 问题的解决方案会随着时间的推移而改进。 :)
        • 这不是一个值成员,而是插入值“copenhagen”的索引位置。 Valuemember 将是与显示成员“copenhagen”相对应的值。您的解决方案只需将项目“哥本哈根”添加到索引 0....
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-19
        • 2012-12-31
        • 2022-11-12
        • 2021-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多