我有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的复选框上配置了“Click”事件(因此事件在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,因此folloging代码失败:
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仍未加载;第二次,f_c2已经加载,因此f_c1数据被成功复制到f_c2的控件。
答案 0 :(得分:1)
子表单位于子表单(或子控件)中。
如果要引用子表单,则必须通过子表单控件执行此操作。
而不是:Me.Parent("f_c2").Form("field_in_f_c2")
应该是:Me.Parent.<name of subform control>.Form.field_in_f_c2