在Combobox中显示成员而不会丢失对相关数据的引用

时间:2017-07-17 21:45:20

标签: vb.net linq methods combobox

我有一个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?

感谢您的关注。

2 个答案:

答案 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}}并相应地设置ComboBoxValueMember

DisplayMember

您还可以将绑定中的对象直接返回到您的匿名类型。

ComboBox1.DataSource = returnBrands()
ComboBox1.DataSource.DisplayMember = "Key"
ComboBox1.DataSource.ValueMember = "Value"

然而,后一种方法并不是最佳实践。