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

时间:2015-12-12 14:02:54

标签: vb.net

我正在处理一个返回MySqlCommand等查询结果的代码,但一切正常,但我尝试做的是将结果插入ComboBox。实现这一目标的方法如下:

  1. 表单加载事件执行GetAvailableCategories函数
  2. 执行的功能下载所有值并将其插入字典
  3. 现在返回的字典需要迭代每个Items以插入ComboBox
  4. 练习示例:

    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
    
    1. GetAvailableCategories功能

      Dim dic As New Dictionary(Of Integer, String)
      
      For Each row In table.Rows
      
         dic.Add(row(0), row(1))
      
      Next
      
      Return dic
      
    2. 如何在1,3点看到我调用返回结果的函数。我想要做的是将row(0)作为项目的值插入,将row(1)作为项目名称插入。但实际上我在ComboBox

      中得到了这个结果
      [1, Hair cut]
      

      我也无法访问迭代中当前项目的特定位置。也许字典不是这个操作的好选择?
      很抱歉,这个问题可能很愚蠢,但是我已经很长时间没有在vb.net中编程了,现在我需要稍微刷一点。

      更新

      我已经明白我可以为.key的{​​{1}}分配值访问权限,因此如果我这样做,我想要实现的结果是正确的:

      dictionary

      现在的问题是:如何在不创建任何其他新类的情况下分配当前项的值?例如:

      cateogoria.key (return the id of record taken from the db)
      categoria.value (is the item name that'll display in the ComboBox)
      

      但我不能这样做,任何想法?

1 个答案:

答案 0 :(得分:1)

作为数据源的List听起来就像你真正追求的那样。依赖于不同阵列中的相对索引有点不稳定。关于这些是什么并不是很多,但课程会将相关信息保存在一起:

Public Class Service
    Public Property Name As String
    Public Property Category As String
    Public Property Id As Int32
End Class

这将把不同的信息保存在一起。使用它们来存储从数据库中读取的信息,并使用List来存储所有这些信息:\

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

最后,将List绑定到CBO:

myCbo.DataSource = Services
myCbo.DisplayMember = "Name"            ' what to show in cbo
myCbo.ValueMember = "Id"                ' what to use for SelectedValue

我真的不知道你想要展示什么或者db字段读取的是什么,所以我猜。但更重要的是,Class会将不同的信息位保持在一起,而不是数组。 List可以是DataSource,因此您甚至不必直接填充CBO。 List也可以使用linq进行排序,搜索,过滤等等。

当用户选择某个内容时,myCbo.SelectedItem应该 该项目(虽然需要投放),或者您可以使用SelectedIndex在列表中找到它:

thisOne = Services(myCbo.SelectedIndex)

在项目/服务类中覆盖ToString通常也是个好主意。这将确定DisplayMember映射不可用时显示的内容。如果没有此项,WindowsApp2.Service可能会显示您的商品:

Public Overrides ToString() As String
    Return String.Format("{0}  ({1})", Name, Price)
End Sub

这会显示类似

的内容
  

理发($ 12.30)