2017-07-17 60 views
2

我有一个TableAdapter像一个表:显示成员在组合框不失参考相关数据

ID_BRAND NAME_BRAND ... (Other columns) 
(...)  (...)    (...) 

我有一个组合框,我需要添加所有NAME_BRANDs,但不失参考其ID_BRAND,因为有一些NAME_BRANDs相同,但ID_BRAND不同。当用户在组合框中选择一个名称时,必须提取通讯员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>) 

但是当我试图通过该方法返回的这个,它返回一个错误。

我还担心,当组合框正确加载NAME_BRANDs时,如何在用户选择NAME_BRAND后提取相应的ID_BRAND?

感谢您的关注。

+0

为此设置了“DisplayMember”和“ValueMember”。也。请阅读[问]并参加[旅游] – Plutonix

回答

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> 
+0

非常感谢您的帮助! – joe

0

您可以指定使用DisplayMember显示哪个值。您还可以保留一个值,以便与您使用的显示相关联ValueMember

.NET有一个KeyValuePair(Of TKey,TValue),它可以方便地保留相关的键和值。

您可以使用Dictionary(Of TKey,TValue)来存储您的ID_BRAND和NAME_BRAND对。您可以拥有重复的NAME_BRAND,但Dictionary需要密钥为唯一。

为了你的需求,你可以从你的方法返回一个Dictionary(Of String, String)并将其绑定到你的组合框:

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 

现在,你有你的字典,你可以将其设置为你的ComboBoxDataSource并设置ValueMember并相应DisplayMember

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

您也从直接绑定返回一个对象到你的匿名类型。

Function returnBrands() As Object 

    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.ToArray() 

End Function 

ComboBox1.DataSource = returnBrands() 
ComboBox1.DisplayMember = "NAME_BRAND" 
ComboBox1.ValueMember = "ID_BRAND" 

但是,后一种方法不被认为是最佳实践。

+0

非常感谢你的帮助! – joe

+0

请花点时间阅读https://stackoverflow.com/help/someone-answers –

+1

试过了代码,现在只有一个从匿名类型返回对象的代码,只是一个小小的更正:代码为我工作是: ComboBox1.DataSource = returnBrands() ComboBox1.DisplayMember = “NAME_BRAND” ComboBox1.ValueMember = “ID_BRAND” (所以没有.DataSource ......也许因为我使用VS 2017年,但说实话说不上来: () 等待测试你的第一个和NoAlias之一 – joe