gpt4 book ai didi

vba - 如何阻止Access提示 "Do you want to save changes to the layout of query"

转载 作者:行者123 更新时间:2023-12-05 01:37:08 26 4
gpt4 key购买 nike

当我尝试关闭在数据 TableView 中具有子表单的表单时,如何阻止 Access 提示“是否要保存对查询布局的更改”?
我在数据 TableView 中有一个带有子表单的表单,其中 .SourceObject设置为临时 枢轴/交叉表查询(没有实际的表单对象)。如果用户更改列的宽度并使用内置的 Access 关闭按钮关闭窗口,则用户(以及恼火的开发人员)总是会看到“是否要保存对查询布局的更改”提示。
enter image description here
我可以通过设置 MySubform.SourceObject = "" 来避免这个提示。在单击我的关闭按钮时,但任何人单击 [x] 按钮或按 CTRL+F4 或 CTRL+W 都会得到提示。
我在 Form_Close 中设置了断点和 Form_Unload事件,但此提示会在它们触发之前出现。
我想进一步澄清这个子表单对象是未绑定(bind)的,而不是基于表单对象。我正在构建动态 Crosstab SQL 语句,使用 SQL 创建 QueryDef,然后设置 MySubform.SourceObject = "query.qry_tmp_Pivot"对于交叉表/数据透视查询来说,这是一种巧妙的技术,因为列可能会有所不同,而且我认为表单对象不会支持这一点。
我可以在 MySubform 对象上使用 Watch 窗口,我可以看到 MySubform.Form对象存在。它有一个 Controls 集合,其中包含我查询中所有列的控件。我有一个可以运行的可选例程,它将遍历所有控件并设置它们的.ColumnWidth = -2 ,它将根据数据表中可见行的最宽数据自动调整列宽。当这个例程运行时,我注意到每次我关闭表单(不使用我的关闭按钮)时,我都会收到保存提示。我已禁用此例程进行调试,但如果用户手动调整任何列宽,用户仍会收到提示。
我觉得我需要解释这个额外的细节,以便您意识到这不是 Access 101 问题。如果你读到这里,你可能知道这一点。这是我的另一个想法:也许我可以在提示发生之前将 Unload 事件捕获在子窗体控件中。因为没有真正的 Form 对象可以放入测试代码,所以我创建了一个类对象并将 MySubform 传递给它。该类使用 WithEvents并创建像 OnClose 这样的事件和 OnCurrent在类模块的 mForm 对象上。示例类代码如下。


Private WithEvents mForm As Access.Form ' This is the form object of the Subform control

Public Sub InitalizeSubform(Subform As Access.Subform)

Set mForm = Subform.Form
Debug.Print Subform.Name, mForm.Name, mForm.Controls.count

' Create some events to intercept the default events.
mForm.OnClick = "[Event Procedure]"
mForm.OnClose = "[Event Procedure]"
mForm.OnUnload = "[Event Procedure]"
mForm.OnCurrent = "[Event Procedure]"

End Sub

Private Sub mForm_Click()
Debug.Print "Clicking " & mForm.Name
End Sub

Private Sub mForm_Current()
Debug.Print "On Current " & mForm.Name, "Record " & mForm.CurrentRecord & " of " & mForm.RecordsetClone.RecordCount
End Sub

Private Sub mForm_Unload(Cancel As Integer)
Debug.Print "Unloading " & mForm.Name
End Sub

Private Sub mForm_Close()
Debug.Print "Closing " & mForm.Name
End Sub
VBE Watch 窗口显示我在 mForm 对象上的新事件,但不幸的是它们从未触发。我知道该类有效,因为我将它与绑定(bind)的子表单一起使用,并且所有事件都被该类拦截。我不确定还能尝试什么。

最佳答案

子表单上的事件永远不会触发,因为它是一个轻量级表单(没有模块)。见 this Q&Adocs .轻量级表单不支持事件监听器,但支持从事件调用公共(public)函数,例如mForm.OnClick = "SomePublicFunction()"
请注意 this answer 中描述的解决方法还开辟了在表单中显示交叉表查询而不保存它的可能性。

或者,您可以尝试在主窗体上捕获事件,并禁止在那里保存。

关于vba - 如何阻止Access提示 "Do you want to save changes to the layout of query",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57720976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com