如何从主窗体内部引用子窗体中对象的事件

Posted

技术标签:

【中文标题】如何从主窗体内部引用子窗体中对象的事件【英文标题】:How to reference events on objects in a subform from inside the main form 【发布时间】:2017-09-05 21:57:49 【问题描述】:

想象一个表单,为了演示的目的,它只包含一个子表单和一个需要相互镜像的文本框。

我尝试通过将文本框上的 Control Source 设置为子表单中字段的值来完成此操作,这可以使它们相互镜像,但文本框不可编辑,所以这是一个不合适的解决方案。

接下来我决定尝试在两个控件上使用 AfterUpdate 事件来运行设置另一个控件值的代码。

这对文本框来说很简单:

'Set value of Notes field on subform whenever value of the corresponding textbox 
Private Sub Notes_Textbox_AfterUpdate()
    Me.subform.Form![Notes] = Me.Notes_Textbox.Text
End Sub

但是,对于子表单字段,这并不简单。我不知道如何以仍然允许我引用该子表单之外的控件的方式引用子表单中的字段上的事件。

作为演示,我需要一种方法来做到这一点:

Private Sub subform_Notes_AfterUpdate()
    Me.Notes_Textbox.Text = Me.subform.Form![Notes]
End Sub

我可以在子表单范围内访问子表单字段 AfterUpdate 事件,但如果这样做,我将无法访问文本框,因为它位于主表单中,而不是子表单中。

所以我要么需要一种方法来在主窗体范围内的子窗体中的字段上定义事件函数,要么需要一种方法使文本框成为子窗体的一部分,同时保持子窗体在数据表视图中打开的能力.

【问题讨论】:

【参考方案1】:

不确定我是否得到了整个问题(数据表视图如何发挥作用?),但这应该可以满足您的需求:

(在子表单中)

Private Sub Notes_AfterUpdate()
    Me.Parent!Notes_Textbox.Value = Me![Notes].Value
End Sub

从评论中编辑:到目前为止,最简单的解决方案是连续表单,而不是子表单中的数据表。

您可以有两个文本框,一个在详细信息部分中,一个在表单页眉或页脚中。两者具有相同的控制源,并在编辑另一个时自动更新。无需代码。

如果必须是subform-datasheet,可以使用类似的方法:将主窗体绑定到同一个记录源,在子窗体的On Current中,将主窗体移动到同一个当前记录。

【讨论】:

啊,.Parent 这就是我要找的东西,谢谢。此外,数据表开始发挥作用,因为我需要在数据表视图中加载该子表单,因为这就是客户想要此表单的方式,并且我不能将文本框放入子表单中,而不会弄乱数据表视图或文本框没有像我一样完全呈现需要它。 你把我弄糊涂了。数据表视图意味着子表单中有多个记录。将主表单文本框与子表单中的一整列同步有什么用?请澄清您真正想要实现的目标。 @MarkKramer 在数据表视图中,您只能看到字符串的第一行,但客户希望在您选择记录时该字段中的所有行都可见,这意味着我需要将文本框链接到该字段和客户端希望文本框是可编辑的,这就是为什么我不能将字段设置为文本框的数据源。

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

如何从主窗体更新子窗体中的图像框控件源

使用 VBA 从主窗体设置子窗体上的窗体属性

将值从主窗体传递到子窗体

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

C# winform怎么实现子窗体关闭时刷新父窗体数据

在winform的MDI窗体中,打开一个新的子窗体的同时如何关闭前一个子窗体?