Ms access 水平选项卡,从导航按钮内的窗体获取文本值

Ms access 水平选项卡,从导航按钮内的窗体获取文本值,ms-access,vba,Ms Access,Vba,我有主页,水平导航,其中包括许多导航按钮,在导航按钮7下我有EmployeesForm,我需要在主页中导航下一个或上一个 ID嵌入在EmployeesForm中,因此在卸载EmployeesForm时,VBA代码(而不是在主窗体上)不会在我在主窗体上时提供正确的ID 我试过Froms!回家!导航子窗体!ID,但这会给出错误,因为任何其他NavigationButton8或9中的任何ID都会给出另一个结果,我不想知道其他按钮中其他表单的ID 我关心的是在EmployeesForm中的ID和主表单文

我有主页,水平导航,其中包括许多导航按钮,在导航按钮7下我有EmployeesForm,我需要在主页中导航下一个或上一个

ID嵌入在EmployeesForm中,因此在卸载EmployeesForm时,VBA代码(而不是在主窗体上)不会在我在主窗体上时提供正确的ID

我试过Froms!回家!导航子窗体!ID,但这会给出错误,因为任何其他NavigationButton8或9中的任何ID都会给出另一个结果,我不想知道其他按钮中其他表单的ID

我关心的是在EmployeesForm中的ID和主表单文本之间建立链接

下面什么都不起作用

Dim MyIDS As Integer

' this is giving only the first ID number all the time.
MyIDS = Me.ID 

' this is giving error.
MyIDS = Forms![Home]![NavigationSubform].[Form]![employeesfrm]![ID]

' this is giving error.
MyIDS = Forms![Home]![NavigationSubform]![Navigationform]![studentsfrm]![ID] 

' this one works but if I am on another Navigation button,
' lets say 8 not 7, I am not interested in the number.
MyIDS = Forms![Home]![NavigationSubform].Form![ID]
我需要这个号码,作为我的书签,如果我直接在EmployeesForm上,而不是在home表单上,它可以正常工作


我不确定我是否完全理解您想要实现的目标,但是在主窗体上,然后在Employees窗体集的OnCurrent事件中,有一个名为EmpID的未绑定文本框如何

Me.Parent!EmpID = ID
如果您正在使用此功能尝试返回到查看其他子窗体之前的同一条记录,那么您还需要一种方法来检测您是否返回到此子窗体,否则OnCurrent事件将再次将您返回到第一条记录。因此,您可能需要在主窗体上设置一个复选框(chkGoToBookmark,默认值False),以便NavigationButton7(这是加载Employees子窗体的内容,对吗?)可以勾选此框。那么Employees表单的OnCurrent事件将是:

If Me.Parent!chkGoToBookmark = True And Not IsNull(Me.Parent!EmpID) Then
    Me.RecordsetClone.FindFirst "ID=" & Me.Parent!EmpID
    Me.Bookmark = Me.RecordsetClone.Bookmark
Else
    Me.Parent!EmpID = ID
End If

请注意,如果您直接在员工表单上,那么对
Me.Parent
的任何引用都将导致错误,因此您可能希望捕获此错误。

非常感谢。我被卡住了,我正在与所有人分享我的解决方案,然而,水平表单很痛苦,真正转到选项卡控制,我的问题是书签,如果你在同一表单上,处理书签很容易,但是当表单位于主(主)表单(导航控件)内时,这并不容易,我所做的是以下几点: 在主窗体(称为Txtv)上创建了一个txt,它将从我的水平按钮中的窗体中托管我的ID,在卸载和加载事件中,我使用了下面的

私有子表单_卸载(取消为整数)

Dim rs作为DAO.Recordset

If Not IsNull(Me.Parent!txtv) Then

    Set rs = CurrentDb().OpenRecordset("bookmarktb", dbOpenDynaset)
    With rs
        .FindFirst "[Variable] = 'CustomerIDLast'"
        If .NoMatch Then
            .AddNew        'Create the entry if not found.
                ![Variable] = "CustomerIDLast"
                ![Values] = Me.Parent!txtv
                ![Description] = "Last customerID, for form " & Me.Name
            .Update
        Else
            .Edit          'Save the current record's primary key.
                ![Values] = Me.Parent!txtv
            .Update
        End If
    End With
    rs.Close
End If
Set rs = Nothing
专用子表单_加载()

作为变体的Dim varID 像绳子一样变暗

varID = DLookup("Values", "bookmarktb", "[Variable] = 'CustomerIDLast'")
If IsNumeric(varID) Then
    With Me.RecordsetClone
        .FindFirst "[ID] = " & strIIZ & varID & strIIZ
        If Not .NoMatch Then
            Me.Bookmark = .Bookmark
        End If
    End With
End If
端接头

请不要忘记添加当前事件的表单me.parent.txtv=ID 因此,它将用主窗体更新ID

我认为在分割数据库后我会受到影响,因为我听说如果分割数据库,findfirst将无法正常工作。
我不确定,但它应该可以与整合的batabase配合使用,

您应该使用Tab控件而不是导航表单控件。可能更适合你的需要。我现在不能改变设计…对吗?如果你愿意,你可以改变设计。在实现目标的同时反复进行设计是很常见的。非常感谢。我被卡住了,我正在和大家分享我的解决方案,然而,水平形式是痛苦的,真的去制表符控制代替,