主窗体选项卡控件将值传递给选择案例的子窗体变量

Posted

技术标签:

【中文标题】主窗体选项卡控件将值传递给选择案例的子窗体变量【英文标题】:Mainform tab control passing value to subform variable for select case 【发布时间】:2018-03-29 19:04:29 【问题描述】:

过去三个小时我一直在搜索这个问题,如果有人问过这个问题并回答了这个问题,我很抱歉,但我找不到解决方案。

我有一个主窗体 frmPHDLP 和子窗体(连续数据表)frmPHDUpdate。也不是绑定形式。 frmPHDLP 上有一个选项卡控件,显示真实世界的办公室位置。该子表单将根据所选选项卡显示每个位置的员工列表。我在 VBA 的子窗体中设置 RecordSource。

第一个标签完美无缺。问题是,当我在主窗体上选择一个新选项卡时,我无法让子窗体重新查询具有新位置的 SQL。 SQL 语句构建在子表单的Form_Current 事件中。

显然运行Me!frmPHDUpdate.Form.Requery 不会触发子表单上的Form_Current 事件。因为为什么会这样?

三个小时。纳达。感谢您的帮助。

frmPHDLP 代码:

Private Sub tabOffices_Change()
    Me!frmPCLPUpdateSF.Requery

End Sub

frmPHD更新代码:

Private Sub Form_Current()
    Dim strSearch As String
    Dim strSQL As String

    Select Case Me.Parent!tabOffices.Value
        Case 0
            strSearch = "8401"
        Case 1
            strSearch = "8400"
        Case 2
            strSearch = "8403"
        Case 3
            strSearch = "8402"
        Case 4
            strSearch = "8404"
        Case 5
            strSearch = "8405"
        Case 6
            strSearch = "8413"
        Case 7
            strSearch = "8411"
    End Select

    strSQL = "SELECT tblEmployee.ID, tblEmployee.[LastName] & "", "" & [FirstName] AS EmpName, tblPHDLProgram.MemberOfPHDL, tblOffices.OfficeID FROM tblOffices INNER JOIN (tblPHDLP RIGHT JOIN tblEmployee ON tblPHDLP.ID = tblEmployee.ID) ON tblOffices.ID = tblEmployee.Office WHERE (((tblOffices.OfficeID)= " & strSearch & "));"
    Me.RecordSource = strSQL

End Sub

【问题讨论】:

为什么要在当前事件中构建 SQL?您为什么不只使用一个子程序来构建您可以手动触发的 SQL,并在您希望的任何事件上触发?你为什么还要构建 SQL(你可以只引用 SQL 中主窗体上的控件)?请分享一些代码。 >你为什么还要构建SQL(你可以只引用SQL中主窗体上的一个控件)?我不太确定你的意思。能给我举个例子吗?如果可行,我很想尝试一下! 你可以看到this answer (first section)。这是一个很好的做法,因为它避免了字符串连接的许多错误。这确实需要您将SELECT CASE 移动到Switch,但它肯定对您有用。 我已经提供了更详细的解释,说明如何在我的回答中使用在您的特定情况下引用控件以避免构建和更改 SQL 子句。 【参考方案1】:

您应该使您的代码更加模块化。此外,您不应更改 Form_Current 上的表单记录源,因为它会重新查询表单,并触发另一个电流,并触发无限循环。这可能都是由于 Access 避免了无限循环造成的。

frmPHD更新代码:

Public Sub BuildSQL()
    Dim strSearch As String
    Dim strSQL As String
    Select Case Me.Parent!tabOffices.Value
        Case 0
            strSearch = "8401"
        Case 1
            strSearch = "8400"
        Case 2
            strSearch = "8403"
        Case 3
            strSearch = "8402"
        Case 4
            strSearch = "8404"
        Case 5
            strSearch = "8405"
        Case 6
            strSearch = "8413"
        Case 7
            strSearch = "8411"
    End Select
    strSQL = "SELECT tblEmployee.ID, tblEmployee.[LastName] & "", "" & [FirstName] AS EmpName, tblPHDLProgram.MemberOfPHDL, tblOffices.OfficeID FROM tblOffices INNER JOIN (tblPHDLP RIGHT JOIN tblEmployee ON tblPHDLP.ID = tblEmployee.ID) ON tblOffices.ID = tblEmployee.Office WHERE (((tblOffices.OfficeID)= " & strSearch & "));"
    Me.RecordSource = strSQL
End Sub

Private Sub Form_Load()
    Me.BuildSQL
End Sub

frmPHDLP 代码:

Private Sub tabOffices_Change()
    Me!frmPCLPUpdateSF.Form.BuildSQL
End Sub

或者,甚至更好:将您的 case 语句移动到子表单 SQL:

作为frmPHDUpdate的记录源

SELECT tblEmployee.ID, tblEmployee.[LastName] & "", "" & [FirstName] AS EmpName, tblPHDLProgram.MemberOfPHDL, tblOffices.OfficeID 
FROM tblOffices 
INNER JOIN (tblPHDLP RIGHT JOIN tblEmployee ON tblPHDLP.ID = tblEmployee.ID) ON tblOffices.ID = tblEmployee.Office 
WHERE tblOffices.OfficeID = Switch(
    Forms!frmPHDLP!tabOffices = 0, 8401,
    Forms!frmPHDLP!tabOffices = 1, 8400,
    Forms!frmPHDLP!tabOffices = 2, 8403,
    Forms!frmPHDLP!tabOffices = 3, 8402,
    Forms!frmPHDLP!tabOffices = 4, 8404,
    Forms!frmPHDLP!tabOffices = 5, 8405,
    Forms!frmPHDLP!tabOffices = 6, 8413,
    Forms!frmPHDLP!tabOffices = 7, 8411
);

【讨论】:

谢谢!将它放入 sub 中,当我 debug.print 它时它会创建正确的 SQL 语句。但是,当我更改选项卡时,子表单信息不会改变。我在Me!frmPCLPUpdateSF.Form.BuildSQL 声明之后放了一个Me!frmPCLPUpdateSF.Form.Requery,但什么也没有。 基本调试:tabOffices_Change 是否正确触发(在其中添加 debug.print)?在 BuildSQL 末尾添加 Debug.Print Me.Recordsource。这也正确改变了吗? tabOffices_Change 正确触发。我在BuildSQL 的末尾添加了调试。它在Form_Load 上循环六次,然后在tabOffices_Change 上循环四次。奇怪的。每次,SQL 语句都是正确的,只是没有填充表单。 查看当前编辑。避免将记录集设置为当前表单,这会导致无限循环,并且访问的技巧打破它可能会导致问题。 好的,修复了多次运行,但是当我更改选项卡时它仍然没有填充子表单。同样,SQL 语句是正确的。【参考方案2】:

查看 MasterLinkFields/ChildLinkFields

我猜你可以使用 tabOfficesOfficeID 并删除所有这些代码。

【讨论】:

不能使用这些字段,因为表单没有绑定到任何东西。另外,tabOffices OfficeIDtabOffices = 页面索引,所以我使用 Select Case 来分配正确的 OfficeID。 @Scott 创建一个表,在其中分配 tabOffices 和 OfficeID,然后在表单查询中使用它是 Gustav 的建议。 1:主窗体不必绑定。 2:子表单设置绑定到您的记录集。一开始就这样做。

以上是关于主窗体选项卡控件将值传递给选择案例的子窗体变量的主要内容,如果未能解决你的问题,请参考以下文章

在 CDialog 类型的子窗体之间传递数据

在MS访问中的子表单上显示查询结果

将值从主窗体传递到子窗体

使用 TableLayoutPanel 控件设置窗体布局

将子控件的点击事件传递给父控件

将子控件的点击事件传递给父控件