【问题标题】:Microsoft Access runtime error 2455 when trying to access grandchildren forms from child form尝试从子窗体访问孙窗体时 Microsoft Access 运行时错误 2455
【发布时间】:2012-05-01 17:17:56
【问题描述】:

我在 Access 2003 数据库(在 Access 2007 中开发)中有三个表单,它们位于父 -> 子 -> 孙关系中。在子窗体的“Form_Load”子窗体中,我设置了孙子窗体的一些属性(窗体标题、行源和控制逻辑)。当我查看子表单时,一切正常。当我查看父表单时,我收到错误:

运行时错误“2455”:您输入的表达式对 Form/Report 属性的引用无效。

参考线:

Me.GrandchildFormName.Form.Foo.Caption = "bar"

我可以访问孙窗体的任何属性除了 Form 属性而不会引发任何错误。有谁知道这可能是什么原因造成的?我在一个新数据库中做了一个测试用例,它工作得很好,所以我倾向于在我与数据库继承的遗留代码中存在一些东西(据我所知,它可以追溯到 18 年前的预访问数据库系统),但我想我会在这里检查一下,看看你们中是否有人知道解决方法。

如果相关的话,表单的实际结构有点复杂,孙表单在子表单中多次出现(在不同的控件名称下),如下所示:

|--------------|
| A            |
|  |----------||
|  | B        ||
|  |  |------|||
|  |  | C[1] |||
|  |  |------|||
|  |          ||
|  |  |------|||
|  |  | C[2] |||
|  |  |------|||
|  |----------||
|--------------|

消除除一种外孙形式之外的所有形式并不能解决问题。

如果有办法让孙子表单知道它正在加载到哪个实例,我可能会编写代码来解决这个问题,但据我所知,这是不可能的。

【问题讨论】:

    标签: ms-access ms-access-2007 vba ms-access-2003 grandchild


    【解决方案1】:

    我将使用ParentChildGrandChild 来引用各自的表单(而不是数据源)。

    通常,子窗体控件的Form 属性仅在显示子窗体后才会获得“有效引用”。因此,如果要执行Child.Form_Load 中的代码,则必须确保GrandChildParent 打开时可见。

    解决方案

    由于我假设在您的情况下 GrandChild 在您打开 Child 时可见(未打开 Parent)但 GrandChild 在您打开 Parent 时不可见,我建议以下解决方案而不进行更改你的用户界面:

    将访问GrandChild.FormChild.Form_Load的代码移动到GrandChild.Form_Load中。每当GrandChild 加载时,它都可以访问来自Child (Me.Parent.Form) 甚至Parent (Me.Parent.Parent.Form) 的所有内容。

    换句话说,GrandChild 必须提取信息(来自 ChildParent)并更改自身,而不是通过更改 GrandChild 将信息推送到 GrandChild 而不是 Child

    示例:

    假设ParentChild 具有1:n 关系,ChildGrandChild 具有1:n 关系。 ParentChild 呈现为数据表,因此 Parent 打开时不会显示 GrandChild。在这种情况下,任何对GrandChild.Form 的访问都会导致2455 运行时错误,因为GrandChild 未显示。

    在此示例中,Child 数据表的每一行都有一个加号,可以显示GrandChild。假设您在Parent 上放置了一个按钮,该按钮执行您当前在Child.Form_Load 子中的代码。在Parent 打开后单击此按钮会导致错误(见上文),但如果您单击Child 中的加号之一,然后单击该按钮,则代码将执行而不会出现 2455 错误 因为在这种情况下,GrandChild 在执行 GrandChild.Form 访问之前就已可见。

    【讨论】:

    • Froms!FormNames 或只是表单名称或两者或感叹号或句号的组合似乎几乎完全随机......您必须使用它来做您想做的事情。
    • 这很有用。我通过将Child 初始化代码从Parent 移回Child(它真正属于的地方)解决了2455 错误之一现在我只需要处理另一个仍在抛出的Parent/Child 对2455,即使我应用了与上面相同的修复程序!呜呜呜……
    【解决方案2】:

    就在给出问题类型的行上方: 出错时继续下一步

    运行它,这将解决您的问题。运行一次后,您可以擦除该行并继续工作。

    【讨论】:

    • 这仅在非常特殊的情况下有效,这似乎不是 OP 问题的一般根源。
    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 2011-07-23
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    相关资源
    最近更新 更多