在展开父表单的第一行之前,无法引用 Access 子表单表单对象

Posted

技术标签:

【中文标题】在展开父表单的第一行之前,无法引用 Access 子表单表单对象【英文标题】:Cannot reference Access subform Form object until the first row of parent form has been expanded 【发布时间】:2018-09-06 16:15:49 【问题描述】:

在数据表视图中打开父窗体时,在展开父窗体的第一行之前,我无法引用子窗体控件的 Form 对象。

我想知道一个很好的解决方法。即使父表单数据表的第一行尚未展开,我也需要能够重新查询这种子表单。

重现问题的步骤:

创建两个表:

CREATE TABLE Parent (
  PK Text PRIMARY KEY
);

CREATE TABLE Sub (
  PK Text PRIMARY KEY,
  FK Text REFERENCES Parent (PK)
);

插入一些数据:

INSERT INTO Parent (PK) VALUES ('A');
INSERT INTO Parent (PK) VALUES ('B');

INSERT INTO Sub (PK,FK) VALUES ('AA','A');
INSERT INTO Sub (PK,FK) VALUES ('BB','B');

根据这些表创建两个表单,并将默认视图设置为Datasheet。 将Sub 表单添加到Parent 表单并链接到sub.FK=parent.PK。 将子窗体容器控件命名为 child。 打开Parent 表单。 展开数据表的第一行,然后折叠它。 尝试重新查询子表单,如下所示:

Forms!Parent!child.Form.Requery  'This succeeds.

关闭并重新打开Parent 表单。 展开数据表的 第二 行,然后将其折叠。 尝试使用相同的代码再次重新查询子表单。

这次它失败并出现以下错误:

Run-time error '2455':
You entered an expression that has an invalid reference to the property Form/Report.

由此,我不得不得出结论,在数据表视图中,子表单 Form 对象在父表单的第一行展开之前是不可引用的。

【问题讨论】:

这是设计使然。父记录必须存在,否则子记录将成为孤立记录 - 这是确定的no-no 感谢您的评论。存在父记录。问题是不能重新查询子表单,除非父表单数据表中的first记录已经展开。 您应该澄清子表单位于Detail 部分而不是页脚/页眉,否则您将无法获得可扩展的Datasheet 【参考方案1】:

不确定这是否正确,但我认为这是由重复的SubForm 控制引起的。它们中的每一个都是不同的Form 对象,尽管它们具有相同的名称。

第一条和第二条记录的区别是Focus。如果展开第一条记录,SubForm 的第一个控件将获得焦点。对于第二条记录,您必须自己设置焦点。如果您单击第二条记录Subform 的记录,则.Requery 有效。如果您在此之后单击第一条记录(不展开),您的 :Requery 也会失败。

另一件事要尝试。展开第一个记录子窗体后,展开第二个(不将焦点设置到控件)。现在向表Sub 添加一条记录,其中BFK,然后是.Requery。你会看到第二个记录子表单没有被请求,只是第一个!

解决方法:

重新查询控件而不是表单
 Forms!Parent!child.Requery

这会影响所有记录。

【讨论】:

是的,你是对的。正如你所说,当父窗体的第一条记录展开时,焦点转到子窗体的第一条记录。 (我不知道——非常有帮助)。如果展开第一条记录,然后将焦点放在第二条(折叠的)父记录上,它也会失败。 我也不知道子窗体控件(我命名为'child')有一个.Requery 方法!对此也心存感激。这确实是我的问题的解决方案。 真正的区别在于它们每个都是一个独立的对象,当它们获得焦点时它们会被完全初始化,因为如果你有数千条记录,就会创建数千个Form 对象。为了尽量减少工作量,它们是分开计算的。 知道了。再次感谢您。

以上是关于在展开父表单的第一行之前,无法引用 Access 子表单表单对象的主要内容,如果未能解决你的问题,请参考以下文章

VB.net怎么添加数据至ACCESS数据库中,并显示在DataGridview控件的第一行(注意:不是最后一行)。

如果表单未绑定,如何选择 MS Access 组合框中的第一项

当我引用其他表时,如何保存在 Access 2003 中的表单中创建的数据?

this() 必须写在构造器的第一行!(因为在构造器之前是没有对象的):这句话应该怎么理解?

MS Access 2010 宏生成器:父窗体上控件的 SetProperty

MS Access 嵌套子表单链接到主(父)表单