我有三种形式。一个窗体是父窗体,其他窗体作为父窗体的子窗体插入:
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"one_answers"f_cn_b")。我已经在f_c2的复选框上配置了"单击"事件(因此该事件在f_c2_a和f_c2_b中都可用)。在这个测试中,我可以从f_c2_b字段访问f_c2_a字段,反之亦然。
更新:我刚刚尝试了一个技巧,但它不起作用:我在父窗体中添加了一个按钮,并为其分配了一个事件,所以当我单击该按钮时,会显示"f_c2"文本框的值。结果:如果我手动单击按钮,则会显示值。但是,如果我在表单f_c1的"Current"事件中添加了一个点击模拟,那么信息就不会显示,同样的旧错误也会发生。难以置信的
更新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_p打开时,f_c1的Form_Current()事件会自动调用两次:第一次,f_c2仍然没有加载;第二次,fc2已经被加载,因此fc1数据被成功地复制到fc2的控制。
子窗体位于子窗体(或子窗体)控件中。
当您想要引用子窗体时,必须通过子窗体控件进行引用。
代替:Me.Parent("f_c2").Form("field_in_f_c2")
应为:Me.Parent.<name of subform control>.Form.field_in_f_c2