1

我有 3 个表格。表单是父表单,其他表单作为父表单的子表单插入:

     f_p            form parent
    /  \
f_c1    f_c2        forms childs 1 and 2

我已经在 f_c1 表格中编写了“当前”事件,所以当用户更改 f_c1 中选定的行时,应该将一些数据复制到 f_c2:

Private Sub Form_Current()

    Me.Parent("f_c2").Form("field_in_f_c2") = Me("field_in_f_c1")

End Sub

但这会返回错误 2455:

You specified an expression that contains a non valid reference to the Form/Report property.

错误似乎在“.Form”部分,因为这有效:

Debug.Print Me.Parent("f_c2").Name

但这不起作用:

Debug.Print Me.Parent("f_c2").Form.Name

换句话说,看起来不可能进入父母的孩子。

会发生什么?

注意:f_c1 通过公共字段绑定到父级,f_c2 不绑定到父级。我将 f_c2 用作控件的可滚动容器。

注2:我做了一个测试:在一个新的空白表格(“f_p_test”)中,我插入了表格f_c2两次(“f_c2_a”和“f_c2_b”)。我已经在 f_c2 的复选框上配置了“单击”事件(因此该事件在 f_c2_a 和 f_c2_b 中都可用)。在这个测试中,我可以从 f_c2_b 字段访问 f_c2_a 字段,反之亦然。


更新:我刚刚尝试了一个技巧,但它不起作用:我在父表单中添加了一个按钮,并为它分配了一个事件,所以当我点击按钮时,显示“f_c2”文本框的值. 结果:如果我手动单击按钮,则会显示值。但是,如果我将点击模拟添加到表单 f_c1 的“当前”事件中,则不会显示信息,会发生同样的旧错误。极好的!


更新 2:已解决,这是一个竞争条件。父表单由其他表单打开,其中:

DoCmd.OpenForm "f_p"

因此子窗体(子窗体 f_c1 和 f_c2)在父窗体之后打开,但子窗体不会同时加载。加载子 f_c1 时,运行其“Current”事件,并尝试访问 f_c2,但仍未加载 f_c2,因此以下代码失败:

Private Sub Form_Current()                  ' "Current" event for f_c1
    Dim f_c2 As Form
    set f_c2 = Me.Parent("f_c2").Form       ' f_c2 could be not loaded
    ' rest of code
End Sub 

解决办法是检测f_c2仍然没有加载:

Private Sub Form_Current()                  ' "Current" event for f_c1
    Dim f_c2 As Form
    On Error Resume Next
    Set f_c2 = Me.Parent("f_c2").Form
    If Err <> 0 Then                        ' if f_c2 is still not loaded, then return
        Exit Sub
    End If
    On Error GoTo 0
    ' rest of code
End Sub 

幸运的是,f_c1 的 Form_Current() 事件在打开父窗体 f_p 时自动调用了两次: 第一次, f_c2 仍然没有加载;第二次,f_c2 已经加载,所以 f_c1 数据成功复制到 f_c2 的控件。

4

1 回答 1

1

子窗体位于子窗体(或子窗体)控件中。

当您想引用子表单时,您必须通过子表单控件来完成。

代替:Me.Parent("f_c2").Form("field_in_f_c2")

它应该是: Me.Parent.<name of subform control>.Form.field_in_f_c2

于 2014-03-04T10:58:41.120 回答