在子窗体中引用控件

Posted

技术标签:

【中文标题】在子窗体中引用控件【英文标题】:Referencing Controls in Subforms 【发布时间】:2015-07-09 15:37:26 【问题描述】:

我无法准确确定以下示例的行为方式为何。

作品:

Debug.Print Forms!Form1![Subform1]!control1 

不起作用:

Debug.Print Forms!Form1![Subform1].control1 

有错误:

运行时错误“438”: 对象不支持该属性或方法

乍一看,我只是假设.control1 正在访问Subform1 的属性而不是控件本身,所以为什么会出现错误是有道理的。

然而,在将这些用于示例时,这种推理似乎并不适用:

Debug.Print Forms!Form1![Subform1].Form.control1 
Debug.Print Forms!Form1!Subform1.Form.control1

结果截图:

对我来说,这些示例看起来就像我正在访问 Chat 的表单对象的 .CHAT_MESSAGE_ID 属性,但我没有收到错误消息并且它们工作正常。

为什么这两个例子有效,而 Debug.Print Forms!Form1![Subform1].control1 却无效?

【问题讨论】:

看到这个:***.com/questions/2923957/… 【参考方案1】:

在许多情况下,Access 表单对象 允许您访问其控件并记录源字段,就好像它们是表单的属性。这意味着当您在该表单中编辑 VBA 代码时可以使用 Intellisense,因此您可以使用 Me.control1Me.control1.Value

引用名为 control1 的控件的值

该功能也是Debug.Print Forms!Form1!Subform1.Form.control1 可以工作的原因。但是Debug.Print Forms!Form1!Subform1.control1 失败了,因为Subform1 是一个控件,而不是表单对象,并且它不包含名为control1 的属性。 (这就是错误消息所抱怨的。)

如果您的子表单的SourceObject 是表或查询而不是实际的表单对象,情况会变得更加复杂。我自己还没有研究过这些变体的细节,但如果你真的想使用 SubformControl.Form.property 模式,我建议你研究一下。

我只使用Forms!Form1!Subform1!control1 之类的东西,这对我来说不太容易混淆。

【讨论】:

这一行:fails because Subform1 is a control, not a form object, and it does not include a property named control1. 绝对是一个清晰的时刻。这也解释了为什么说.Form 有点像将控件“强制转换”为表单,然后它再次“正常”地运行。 很好,我为此苦苦挣扎。 ;-) RE 评论的最后一部分,我想说.Form 指的是包含在子表单控件中的表单对象。该表单对象支持名为 control1 的属性,但子表单 control 不支持。【参考方案2】:

bang (!) 运算符访问集合中的默认属性和对象。 显然Subform.FormSubform 控件的默认属性,Controls 集合是Form 类的默认属性。因此,您可以使用Subform!ControlName 访问子表单上的控件。但是,如果您说Subform.ControlName,您专门尝试访问Subform 控件的名为“ControlName”的属性。而那个不存在。

银行 (!) 运算符搜索匹配的对象。点 (.) 运算符假定直接引用现有属性。

【讨论】:

以上是关于在子窗体中引用控件的主要内容,如果未能解决你的问题,请参考以下文章

C# Winform主窗体和子窗体之间如何相互操作对方的控件

delphi 子窗体如何调用父窗体的方法

在子窗体中保存记录

如何在子线程中访问父线程的空间

访问子窗体未绑定控件#Error

如何重新访问之前在子控件中声明的用户控件?