Vb.net 带子查询的DataRepeater上的标签数据绑定
我正在用Access DB在VB.NET中制作一个联系人管理器Windows窗体应用程序。此数据库中的联系人可以有多个电子邮件地址,但其中只有一个可以是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
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的记录。我已使用一个工作示例更新了原始帖子这解决了我面临的问题。我仍然保留这个答案,因为它完全解决了我最初的要求。