在展开父表单的第一行之前,无法引用 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
添加一条记录,其中B
为FK
,然后是.Requery
。你会看到第二个记录子表单没有被请求,只是第一个!
解决方法:用
重新查询控件而不是表单 Forms!Parent!child.Requery
这会影响所有记录。
【讨论】:
是的,你是对的。正如你所说,当父窗体的第一条记录展开时,焦点转到子窗体的第一条记录。 (我不知道——非常有帮助)。如果展开第一条记录,然后将焦点放在第二条(折叠的)父记录上,它也会失败。 我也不知道子窗体控件(我命名为'child')有一个.Requery
方法!对此也心存感激。这确实是我的问题的解决方案。
真正的区别在于它们每个都是一个独立的对象,当它们获得焦点时它们会被完全初始化,因为如果你有数千条记录,就会创建数千个Form
对象。为了尽量减少工作量,它们是分开计算的。
知道了。再次感谢您。以上是关于在展开父表单的第一行之前,无法引用 Access 子表单表单对象的主要内容,如果未能解决你的问题,请参考以下文章
VB.net怎么添加数据至ACCESS数据库中,并显示在DataGridview控件的第一行(注意:不是最后一行)。
如果表单未绑定,如何选择 MS Access 组合框中的第一项
当我引用其他表时,如何保存在 Access 2003 中的表单中创建的数据?
this() 必须写在构造器的第一行!(因为在构造器之前是没有对象的):这句话应该怎么理解?