【问题标题】:MS Access: Hiding a sub form when Focus is lost for any other controls but itselfMS Access:当焦点为除自身之外的任何其他控件丢失时隐藏子表单
【发布时间】:2017-11-07 11:26:44
【问题描述】:

我正在开发一个 MS 访问数据库 (2016)。

我有一个主窗体(名为 MF),其中包含大量控件,包括一个子窗体。这个子窗体名为 SF,它与 MF 上的两个控件相关。这些控件名为 C1C2

MF 加载时,SF 不可见。

C1C2 获得焦点时,SF 可见性设置为 True

现在我需要的是:

1- 一旦 C1C2 失去对其他控件的关注,将 SF 可见性设置为 False SF 除外。

2- 将 SF 可见性设置为 False 一旦它失去对 MF 上除 C1 和 C2

一开始看起来很简单,看起来很直接,但事实并非如此。

我用过:

Private Sub C1_GotFocus()
    Me.SF.Visible = True
End Sub

Private Sub C2_GotFocus()
    Me.SF.Visible = True
End Sub

Private Sub C1_LostFocus()
    Me.SF.Visible = False
End Sub

Private Sub C2_LostFocus()
    Me.SF.Visible = False
End Sub

Private Sub SF_LostFocus()
    Me.SF.Visible = False
End Sub

现在,如果 C1C2 失去对 SF 的控制,它就会消失,我无法为 C1 选择所需的信息strong> 和 C2

此外,如果 SF 失去 C1C2 的焦点,它确实会消失

用几个 if 语句似乎很容易解决这个问题,但事实并非如此。

问题在于LostFocus() 事件无法预测获得焦点的新控件。因此,很难做到这一点。

我在网上搜索了一个解决方案,但没有找到我可以使用的东西。

一种解决方法是省略 C1C2SFLostFocus() 事件,并在 上设置所有其他单个控件>MF 获得焦点以隐藏 SF

虽然这可以满足我的需要,但它似乎不是一个实用的解决方案。

有没有更直接、更合理的方法来实现这一点?

请记住,主窗体有太多控件,无法以这种方式编码。

谢谢。

【问题讨论】:

    标签: forms ms-access lost-focus


    【解决方案1】:

    我会考虑使用 MF 的 OnCurrent 事件,该事件会在设置新记录或移动到新记录时触发。我不确定 C1 或 C2 是否可编辑。如果他们不是那么这很简单。如果是,您只需要在设置 SF 的可见性之前确保两者都有一个值。 MF 背后的代码应该有一个函数,不绑定到任何事件,名称类似于“SetSubformVisibility”。在其中,检查 C1 和 C2 的值并相应地显示/隐藏 SF。确保仅设置可见性(如果尚未设置)。例如:

    If Me.SF.Visible = true THEN Me.SF.Visible = False
    

    通过这种方式,您并不总是设置它,因为 Access 会随着其事件模型的工作方式而闪烁。这样,如果它运行得比它应该运行的多,那么什么都不会发生。然后可以在表单的 OnFocus、OnLostFocus、OnCurrent 等中调用这个单一的函数。根据 C1 和 C2 的可编辑性,OnCurrent 可能就足够了。

    您可能还想将一些逻辑移到 SF 中,例如 OnLoad。您可以引用父表单并根据需要以编程方式更改 SF RecordSource。使用子窗体控件的 LinkChild/Master 属性可能比较困难。

    祝你好运!

    【讨论】:

    • 感谢@DanielG,C1C2 是可编辑的,它们用于过滤 SF 内容。当 SF 中显示所需的值时,可以通过双击它来获取它。问题是如果活动控件是 C1C2,如何使 SF 子窗体可见SF 本身。否则应该隐藏。当焦点从 C1C2 丢失时会出现此问题,因为丢失焦点代码会隐藏 SF。如果焦点移动到 SF 本身,我怎么能告诉 C1C2 不要隐藏 SF
    • C1 和 C2 的 AfterUpdate 事件会更好吗?换句话说,只有当这个值发生变化时才应该做些什么。另外,也许在您的代码中考虑合并 Screen.ActiveControl 属性,如果它是 C1、C2 或 SF,请将 hide 属性短路?
    • 另一个想法是有一个名为“应用过滤器”的按钮来请求子表单。如果 C1 和 C2 是未绑定的过滤器控件(未绑定到字段),则可能让用户输入一个或多个参数,然后单击 Apply 按钮。该按钮背后的代码可以以受控方式运行您的逻辑,并且可以一次应用两个参数。
    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2011-07-20
    相关资源
    最近更新 更多