Vb.net 如何获取字典的特定索引?

Vb.net 如何获取字典的特定索引?,vb.net,Vb.net,我正在编写一个返回查询结果的代码,如MySqlCommand,一切都很好,但我尝试将结果插入到组合框中。实现这一目标的途径如下: 表单加载事件执行GetAvailableCategories函数 执行的函数下载所有值并将其插入字典 现在返回的字典需要对每个项进行迭代才能插入到组合框中 实践示例: 1,3。触发函数的事件 Private Sub Service_Load(sender As Object, e As EventArgs) Handles MyBase.Load F

我正在编写一个返回查询结果的代码,如
MySqlCommand
,一切都很好,但我尝试将结果插入到
组合框中。实现这一目标的途径如下:

  • 表单加载事件执行
    GetAvailableCategories
    函数
  • 执行的函数下载所有值并将其插入字典
  • 现在返回的字典需要对每个
    项进行迭代才能插入到组合框中
  • 实践示例:

    1,3。触发函数的事件

        Private Sub Service_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
        For Each categoria In Categories.GetAvailableCategories()
            service_category.Items.Add(categoria)
        Next
    
        End Sub
    
  • GetAvailableCategories
    函数

    Dim dic As New Dictionary(Of Integer, String)
    
    For Each row In table.Rows
    
       dic.Add(row(0), row(1))
    
    Next
    
    Return dic
    
  • 如何在
    1,3
    点中看到我调用返回结果的函数。我要做的是插入
    行(0)
    作为项目的值,插入
    行(1)
    作为项目名称。但实际上我在
    组合框中得到了这个结果:

    [1, Hair cut]
    
    而且我无法访问迭代中当前项的特定位置。也许字典不是这个手术的好选择?
    很抱歉,如果这个问题可能很愚蠢,但是我已经很久没有在vb.net中编程了,现在我需要复习一下

    更新

    我知道我可以将值access分配给我的
    字典
    ,因此如果我这样做,我想要得到的结果是正确的:

    cateogoria.key (return the id of record taken from the db)
    categoria.value (is the item name that'll display in the ComboBox)
    
    现在的问题是:如何分配当前项的值而不创建任何其他新类?例如:

    service_category.Items.Add(categoria.key, categoria.value)
    

    但是我不能这样做,你知道吗?

    作为数据源的
    列表听起来像是你真正想要的。依靠不同数组中的相对索引有点不可靠。关于这些信息的内容并不多,但一个类会将相关信息保存在一起:

    Public Class Service
        Public Property Name As String
        Public Property Category As String
        Public Property Id As Int32
    End Class
    
    这将使不同的信息位保持在一起。使用它们存储从数据库读取的信息,并使用列表存储所有信息:\

    Private Services As New List(of Service)
    ...
    
    For Each row In table.Rows
    
       Dim s As New Service
       s.Name = row(0).ToString()    '???
       s.Category =...
       s.Id = ...
       Services.Add(s)          ' add this item to list
    Next
    
    最后,将列表绑定到CBO:

    myCbo.DataSource = Services
    myCbo.DisplayMember = "Name"            ' what to show in cbo
    myCbo.ValueMember = "Id"                ' what to use for SelectedValue
    
    我真的不知道你想显示什么,或者db字段读的是什么,所以我猜。但更重要的一点是,类将比数组更好地将不同的信息位保存在一起。列表可以是数据源,这样您甚至不必直接填充CBO。还可以使用linq对列表进行排序、搜索、筛选等

    当用户选择某个项目时,
    myCbo.SelectedItem
    应该是该项目(尽管需要强制转换),或者您可以使用
    SelectedIndex
    在列表中查找该项目:

    thisOne = Services(myCbo.SelectedIndex)
    
    在item/service类中重写
    ToString
    ,通常也是一个好主意。这将确定当
    DisplayMember
    映射不可用时显示的内容。如果没有此选项,
    WindowsApp2.Service
    可能会为您的项目显示:

    Public Overrides ToString() As String
        Return String.Format("{0}  ({1})", Name, Price)
    End Sub
    
    这将显示类似于

    理发费(12.30美元)


    未指定字典中项目的顺序。由于您通过密钥访问项目,因此顺序应该无关紧要。您可能需要一个排序列表,而不是我可以访问特定索引的排序列表的标题?我想要类似于关联数组或简单数组的[0]=>value name好吧,一个简单的列表会给你这个,如果你把这个键用作键而不是索引器,你的字典也能用
    dic.Add(第(0)行,第(1)行))
    使用第(0)行作为键,第(1)行作为值,这看起来很奇怪,这取决于itOkay中的内容。我会看一看,但这一点我可以按照您所说的使用.key。有没有一种方法可以将值添加为键?检查我的更新items集合不允许为一个项目添加两个元素(
    service\u category.items.add(categoria.key,categoria.value)
    )。这就是使用数据源背后的要点——所有信息位都集中在类对象中,并且很容易获得,并且列表的内容始终与CBO相同。CBO将以SelectedItem的形式为您提供所选项目,而无需在其他集合或阵列中找到它。现在已经清楚了,感谢您解释我需要什么,祝您愉快:)为什么现在我不能启动SelectIndexChange?
    SelectedText
    可能不是您所认为的,也不是您想要的数据源。我不知道您是如何制作的,但是如果显示的是名称,则将
    SelectedItem
    强制转换为服务项目(同样,不知道您使用的名称),然后使用
    name
    属性。例如:
    thisOne=Ctype(cbo.SelectedItem,Service):theName=thisOne.Name
    cbo现在包含对象,因此您可以使用为该类创建的属性