我有 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 的控件。