Vb.net 带子查询的DataRepeater上的标签数据绑定

Vb.net 带子查询的DataRepeater上的标签数据绑定,vb.net,ms-access,Vb.net,Ms Access,我正在用Access DB在VB.NET中制作一个联系人管理器Windows窗体应用程序。此数据库中的联系人可以有多个电子邮件地址,但其中只有一个可以是primary,我在代码中控制该电子邮件地址,因为只有一个电子邮件地址是该联系人的主电子邮件地址:如果新的电子邮件地址被选中为primary,则它将取消选中当前联系人的其他行。注意:Primary是布尔列的名称,而不是PK列。表的设置如下所示: Contact Table Email Table [Co

我正在用Access DB在VB.NET中制作一个联系人管理器Windows窗体应用程序。此数据库中的联系人可以有多个电子邮件地址,但其中只有一个可以是
primary
,我在代码中控制该电子邮件地址,因为只有一个电子邮件地址是该联系人的主电子邮件地址:如果新的电子邮件地址被选中为
primary
,则它将取消选中当前联系人的其他行。注意:
Primary
是布尔列的名称,而不是PK列。表的设置如下所示:

Contact Table                       Email Table
[ContactID]     Integer PK column   [EmailID]       Integer PK column
[Name]          String              [Email Address] String
                                    [ContactID]     Integer FK column related to Contact.ContactID
                                    [Primary]       Boolean
我之前收到了关于获取标签文本的帮助,它可以只提取主列中选中的电子邮件地址。但是,相同的
Label.Text
显示在数据中继器中的所有索引上。现在,它为什么这样做实际上是有道理的,因为当它用数据库中的数据填充时,没有地方可以设置Label1.Text属性

从VisualStudio的“数据源”窗口中提取的绑定控件显示有关数据转发器控件的正确信息。我在数据转发器上放置了一个标签,并使其显示每个联系人的正确电子邮件地址,但未成功(即,如果联系人1有电子邮件,john。smith@acmecorp它将正确显示,但相同的标签应用于data repeater控件上的所有索引,并且Contact#2显示相同的电子邮件,而不是jane。doe@acmecorp.com)

我希望得到一些解决方法的指导,因为我能找到的几乎所有解决方案都使用ASP.NET,这似乎不适用,因为VB中没有相同的数据转发器事件。我不确定是否有一种简单的方法以编程方式对标签进行数据绑定,以使每个索引显示不同,或者是否有要创建新的DataTable并用所有值和数据填充它,请将其绑定到data repeater控件,而不是我现在使用的
ContactEmailBindingSource

编辑: 当我尝试在Label1上设置数据绑定时,我尝试添加以下查询:

SELECT        Email.[E-mail Address]
FROM            (Email INNER JOIN
                         Contact ON Email.ContactID = Contact.ContactID)
WHERE        (Email.[Primary] = True)
我收到一个搜索条件生成器错误:

The schema returned by the new query differs from the base query.
更新:

提供了答案的工作示例

最终更新:

老实说,我不知道应该查找什么来解决这个问题,在几次搜索后,我发现创建子查询。实际实现起来比我希望的要长一些,但现在我有了一个概念证明,可以使用,并在这里为需要这种功能的任何人共享

需要表单上的
DataGridView1
按钮1
,然后插入此代码:

Imports System.ComponentModel
Imports System.Data.OleDb

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim dbProvider As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source ="
        Dim dbSource As String = Application.StartupPath & "\Data\ContactsDB.accdb"
        Dim connString As String = dbProvider & dbSource
        Dim dt As New DataTable

        Dim query1 As String = "SELECT   [ContactID], 
                                         [ContactName], "

        Dim query2 As String = "(SELECT  [Email Address]
                                 FROM    [EmailsTable]
                                 WHERE   [ContactsTable].[ContactID] = [ContactID]
                                 AND     [Primary] = True)
                                 AS PrimaryEmail "

        Dim query3 As String = "From [ContactsTable];"

        Using cn As New OleDbConnection(connString),
                cmd As New OleDbCommand(query1 + query2 + query3, cn)

            cn.Open()
            dt.Load(cmd.ExecuteReader)

        End Using

        DataGridView1.DataSource = dt

    End Sub
End Class
我试图实现的工作示例

注意:为简化此示例,我跳过了使用DataRepeater。若要在data repeater控件上使用标签,只需在
dt.Load(cmd.ExecuteReader)
之后添加此标签,它将在Label1上显示您放在DataRepeater.ItemTemplate上的电子邮件地址:

Label1.DataBindings.Add(New Binding("Text", dt, "PrimaryEmail"))

我手边没有DataRepeater,所以我只是在DataGridView中显示数据

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim dt As New DataTable
    Using cn As New OleDbConnection(My.Settings.ContactsConnect),
            cmd As New OleDbCommand("Select [Contact Table].ContactID, 
                                            [Contact Table.Name], 
                                            [Email Table].[Email Address] 
                                            From [Contact Table] 
                                            Inner Join [Email Table] On [Contact Table].ContactID = [Email Table].ContactID 
                                            Where [Email Table].Primary = True;", cn)
        cn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    DataGridView1.DataSource = dt
End Sub

我按字面意思记下了您的表名。您需要更正为真实的表名。

我们可以看到您用于绑定控件的select命令吗?似乎连接已就绪。【联系人表。电子邮件】中有什么内容?@Mary-【联系人表。电子邮件】不正确。联系人表上没有电子邮件列,我已在OP中更正了这一点,并将我尝试过的查询张贴在数据转发器上的标签上。查看其他正在工作的控件的查询是否有帮助?此项目是一个更大项目的一部分,我无法使您的代码正常工作,因此我创建了一个新的Access DB文件和Visual Studio项目,将查询修改为匹配,这与我所需要的完全一样。我已经为遇到相同问题的其他人更新了OP的工作示例。非常感谢您的帮助!我已经接受了答案,只要我得到15个代表,我就可以投票。我刚刚决定我无法将其用于我的原始代码的原因是,如果没有电子邮件地址设置为primary,它将不会显示任何内容。但这确实让我更接近我所需要的内容。@user9343037 Where子句将返回的记录限制为仅包含primary=True的记录。我已使用一个工作示例更新了原始帖子这解决了我面临的问题。我仍然保留这个答案,因为它完全解决了我最初的要求。