我有一个TableAdapter用于表格:
ID_BRAND NAME_BRAND ... (Other columns)
(...) (...) (...)
我有一个ComboBox,我需要添加所有NAME_BRAND,但不会丢失对其ID_BRAND的引用,因为有一些NAME_BRAND相同,但ID_BRAND不同。当用户在ComboBox中选择一个名称时,必须提取对应的ID_BRAND。
另外,我需要在方法中进行查询,但问题是我不确定要返回什么类型的数据。
Function returnBrands() As ??
brands.Fill(db.brands) 'my brandsTableAdapter
Dim q = From pc In db.brands
Select pc.NAME_BRAND, pc.ID_BRAND
Order By NAME_BRAND
Return q
End Function
Visual Studio说q是一种
OrderedEnumerableRowCollection(Of <anonymous type: Key NAME_BRAND As String, Key ID_BRAND As String>)
但是当我尝试通过该方法返回时,它会返回错误。
我还担心当ComboBox正确加载NAME_BRAND时,如何在用户选择NAME_BRAND后提取相应的ID_BRAND?
感谢您的关注。
答案 0 :(得分:0)
创建一个代表您要查询的表的类型。像这样:
Public Class Brand
Public Property ID_BRAND As String
Public Property NAME_BRAND As String
End Class
在查询的选择部分中,指定品牌类型并复制相应的值:
Dim q = From pc In db.brands
Select New Brand WITH { .ID_BRAND = pc.ID_BRAND, .NAME_BRAND = pc.NAME_BRAND }
Order By NAME_BRAND
现在你的函数签名看起来像这样:
Public Function returnBrands() As IQueryable<Brand>
答案 1 :(得分:0)
您可以使用DisplayMember
指定要显示的值。您还可以使用ValueMember
.NET有一个KeyValuePair(Of TKey,TValue)
,可以方便地保存相关的键和值。
您可以使用Dictionary(Of TKey,TValue)
来存储您的ID_BRAND和NAME_BRAND对。您可以拥有重复的NAME_BRAND,但字典要求密钥为唯一。
根据您的需要,您可以从您的方法返回Dictionary(Of String, String)
并将其绑定到您的ComboBox:
Function returnBrands() As Dictionary(Of String, String)
brands.Fill(db.brands) 'my brandsTableAdapter
Dim q = From pc In db.brands
Select pc.NAME_BRAND, pc.ID_BRAND
Order By NAME_BRAND
Return q.ToDictionary(Of String, String)(Function(x) x.ID_BRAND, Function(x) x.NAME_BRAND)
End Function
现在您已拥有字典,可以将其设置为DataSource
的{{1}}并相应地设置ComboBox
和ValueMember
:
DisplayMember
您还可以将绑定中的对象直接返回到您的匿名类型。
ComboBox1.DataSource = returnBrands()
ComboBox1.DataSource.DisplayMember = "Key"
ComboBox1.DataSource.ValueMember = "Value"
然而,后一种方法并不是最佳实践。