【问题标题】:how to check if subform is opened in ms access如何检查子窗体是否在 ms 访问中打开
【发布时间】:2023-03-23 10:48:01
【问题描述】:

我有一个主窗体 MYMAIN,其中有两个子窗体 MYSUBONE 和 MYSUBTWO。

我在每个子表单中都有更新另一个子表单中的文本框的“当前”事件。

我的问题是在加载表单时出现的。当子表单“MYSUBONE”被加载(在“MYSUBTWO”被加载之前)并尝试更新 MYSUBTWO 中尚未加载的文本框时,会触发“on current”事件。所以在事件过程中会触发错误。

如何检查我的“当前”事件过程(在 VBA 中?),以便 MYSUBONE 检查 MYSUBTWO 子表单是否尚未加载。

on-current-mysubone 如果 mysubtwo 未加载,则 更新 mysubtwo.textbox = ... 结束如果

我尝试了示例数据库“Northwind”中的“Isloaded”功能,但似乎不起作用。 如何检查子表单是否尚未加载?

或者我可以忽略错误并使用“如果错误,退出函数”之类的东西吗?

【问题讨论】:

  • IsLoaded() 不适用于子表单,因为它们不是 Forms 集合的一部分——只有主表单在该集合中。

标签: ms-access


【解决方案1】:

解决此问题的一种可能方法是确保您知道加载子表单的顺序。您可以通过取消绑定子表单控件然后手动加载它们来完成此操作。操作方法如下:

  1. 像往常一样将子表单控件添加到父表单。
  2. 确保您的链接字段等按您想要的方式设置。
  3. 在子表单属性>数据选项卡中,删除“源对象”字段中的值。

添加 VBA 以在父窗体打开时手动绑定控件:

Private Sub Form_Open(Cancel As Integer)
    Me.sfB.SourceObject = "FormB"
    Me.sfA.SourceObject = "FormA"
End Sub

【讨论】:

    【解决方案2】:

    子窗体实际上是在主窗体打开之前打开的(包括它们的所有 OnCurrent 事件)。我认为您也不能保证它们的加载顺序。

    我会解决问题并从主窗体进行更新。如果您确实需要从子表单进行更新,请将更新移至 MySubOne 中的单独函数。然后在主窗体的OnCurrent中,调用MySubOne中的函数。这将保证MySubOneMySubTwo 都已加载。

    【讨论】:

    • 这可以防止子表单在其数据发生变化而不是主表单时更新相反的子表单。
    • 这很容易解决,方法是在子表单的 AfterUpdate 事件上调用相同的函数。
    • 还请记住,当父表单到达新记录时,子表单的 OnCurrent 事件会被调用两次。有时您必须输入代码以防止子窗体的 OnCurrent 中的内容触发两次。通常的方法是在子表单的代码中使用模块级变量来存储最后一个 OnCurrent 事件的 PK 值。在 OnCurrent 中,检查该变量的值是否与当前 PK 值匹配。如果是这样,请跳过代码(您已经在第二个 OnCurrent 上)。如果没有,让事件触发并更改变量的值。乱?是的!
    • 有没有办法检查检索到的子表单记录数是 0 还是 null?类似 (if forms!mysubtwo.[Record count] = 0? or forms!mysubtwo.[current record??] is null or = ""? 如果是,那么正确的语法是什么?
    • rtochip,我不知道,但你为什么不把它作为自己的问题发布。
    【解决方案3】:

    不知道它是否有用,但是对于它的价值... 我正在显示两个具有父子关系的网格。但是,第二个网格会立即显示与第一个网格中的所有父记录关联的所有子记录。当在第一个网格中选择一个记录时,我想在第二个网格中找到第一个相应的子记录。在最初打开主窗体时,我遇到了与第二个网格(子窗体)记录集的引用失败相同的问题,因为第二个网格尚未显示。我的解决方法包括捕获错误 2455 并忽略它,因此它有机会继续,直到第二个网格完全显示。

    Private Sub Form_Current()
    Dim rsResults As Recordset
    Dim stFilter As String
    
    On Error GoTo ErrHdlr
    
    'Locate first results record associated to current requisition
    Set rsResults = Me.Parent.sfResults.Form.Recordset
    stFilter = obRecord.GetFilter(Me.Recordset, vrPKFields, vrPKTypes)
    rsResults.FindFirst (stFilter)
    
    Exit Sub
    
    ErrHdlr:
    If Err.Number = 2455 Then
       Exit Sub 'When this sub form is first displayed, Current event
                   'tries to reference another subform on the same parent.
                   'However, such second subform is not yet open and
                   'reference fails. This is the error number raised,
                   'so it is ignored on purpose. After second subform
                   'is displayed, code works correctly.
                   'It had to be handled this way because there's no way
                   'to know in advance whether subform is already open.
    Else
       msgbox Err.number & " " & err.description
    endif
    exit sub
    

    【讨论】:

      【解决方案4】:

      “有没有办法检查检索到的子表单记录数是否为0”

      if forms!myMainForm!mySubForm.form.RecordsetClone.RecordCount = 0 then....
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多