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现在包含对象,因此您可以使用为该类创建的属性