是否可以在更新前事件期间将焦点设置在控件上而不取消更新?
Posted
技术标签:
【中文标题】是否可以在更新前事件期间将焦点设置在控件上而不取消更新?【英文标题】:Is it possible to set the focus on a control during BeforeUpdate event without cancelling the update? 【发布时间】:2011-03-22 16:56:56 【问题描述】:在 MS Access 2007 中更新表单中的数据之前,我需要检查数据的有效性。当将焦点设置在控件上以读取其属性时,更新事件将始终取消,无论我是否将 Cancel 设置为 true。我已经修剪了我的代码,只在代码中留下了 TextBox.SetFocus,这足以取消更新。 我知道我可以在不设置焦点的情况下读取文本框的值;但我也需要为其他属性设置焦点。 我的问题有解决方法吗?有什么我可能会丢失的吗? 谢谢
Private Sub Form_BeforeUpdate(Cancel As Integer)
Me.LastName.SetFocus
End Sub
【问题讨论】:
BeforeUpdate
form 或 control 的事件?
这是一个与数据字段同名的文本框吗?
【参考方案1】:
我不知道您对代码中的文本框做了什么(也许您正在导致其他一些被忽略的错误?),但您可以将所有这些值保存在表单中的变量中并设置它们在文本框的 onchange、更新事件之前/之后。
你有机会发布代码吗?在表单的 BeforeUpdate 事件中设置文本框的焦点不会导致它取消(我后来检查了取消的值。)。
【讨论】:
您好杰夫,感谢您的回复。这是我的代码的最简单形式: Private Sub Form_BeforeUpdate(Cancel As Integer) Me.LastName.SetFocus End Sub 只要焦点不在 LastName 上,更新就会取消,即使我没有将 Cancel 设置为 True。似乎第一次将焦点设置在 LastName 上;尝试第二次更新成功(因为焦点已经在姓氏上)。现在假设我需要将焦点设置在多个文本框上;这是真正的问题发生的地方呵呵。有什么建议吗?【参考方案2】:假设您正在处理控件的 BeforeUpdate 事件(而不是窗体的),为什么不直接将代码移动到控件的 AfterUpdate
事件?
您真正失去的唯一东西是取消控件更新的能力,但您始终可以在 AfterUpdate 事件中自己实现该功能。您只需要跟踪控件的先前值。为此,您将创建一个PrevVal
模块级变量并将其设置为Form_Current 事件、Form_Undo 事件以及控件的AfterUpdate 事件中的最后一步的控件值。然后,如果用户输入了无效数据,您可以在控件的 AfterUpdate 事件的第一部分回滚到之前的值。
【讨论】:
您好 mwolfe02,感谢您的回复。实际上,我需要使用表单的 BeforeUpdate 事件(而不是控件的 BeforeUpdate 事件),因为我需要在允许用户更新数据之前验证数据。对此有何想法?以上是关于是否可以在更新前事件期间将焦点设置在控件上而不取消更新?的主要内容,如果未能解决你的问题,请参考以下文章