Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms 访问VBA:子窗体可以';无法从其他子窗体获取值_Forms_Ms Access_Ms Access 2010_Subforms - Fatal编程技术网

Forms 访问VBA:子窗体可以';无法从其他子窗体获取值

Forms 访问VBA:子窗体可以';无法从其他子窗体获取值,forms,ms-access,ms-access-2010,subforms,Forms,Ms Access,Ms Access 2010,Subforms,我有三张表格。一个窗体是父窗体,其他窗体作为父窗体的子窗体插入: 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("fi

我有三张表格。一个窗体是父窗体,其他窗体作为父窗体的子窗体插入:

     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_测试”)中,我插入了两次表格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时,其“当前”事件将运行,并尝试访问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 
Private Sub Form_Current()'f_c1的“Current”事件
尺寸f_c2作为形式
出错时继续下一步
设置f_c2=Me.Parent(“f_c2”).表单
如果错误为0,则“如果f_c2仍未加载,则返回”
出口接头
如果结束
错误转到0
'代码的其余部分
端接头

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

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

如果要引用子窗体,必须通过subform控件进行引用

而不是:
Me.Parent(“f_c2”).Form(“f_c2中的字段”)


它应该是:
Me.Parent..Form.field\u在\u f\u c2中

我知道,然后子表单控件的名称是“f\u c2”。即使我更改了子窗体控件的名称(在父窗体和程序中),错误仍然存在。