gpt4 book ai didi

ms-access - 替代 SendKeys "{Esc}"用于未绑定(bind)的文本框撤消

转载 作者:行者123 更新时间:2023-12-02 03:28:43 25 4
gpt4 key购买 nike

我有一个未绑定(bind) 文本框控件。用户输入一些有效文本并离开控件。然后用户返回到控件并输入一些无效文本。我想向用户显示一条消息,然后将控件的值回滚到其之前的状态将焦点保留在该控件中

我尝试了以下方法,但没有一种能准确地满足我的需求:


选项 A:发送 key

Private Sub MyTextBox_BeforeUpdate(Cancel As Integer)
Cancel = DataIsInvalid(Me.MyTextBox.Value)
If Cancel Then SendKeys "{Esc}"
End Sub

这正是我想要的,但我真的想避免使用 SendKeys。使用 SendKeys 会带来很多问题:Vista+ compatibility , key 被发送到不同的应用程序等。


选项B:撤销控制的方法

Private Sub MyTextBox_BeforeUpdate(Cancel As Integer)
Cancel = DataIsInvalid(Me.MyTextBox.Value)
If Cancel Then Me.MyTextBox.Undo
End Sub

这对于未绑定(bind)的控件来说是简单的破坏(至少从 MS Access 2002/XP 开始)。此方法不会将 MyTextBox 的值恢复为有效输入。但是,它确实允许用户将焦点更改为新控件,同时将无效输入留在 Me.MyTextBox 中!难以置信!!!


选项C:撤销表单的方法

Private Sub MyTextBox_BeforeUpdate(Cancel As Integer)
Cancel = DataIsInvalid(Me.MyTextBox.Value)
If Cancel Then Me.Form.Undo
End Sub

此处的Undo 完全没有任何作用。但至少它不会破坏 BeforeUpdate Cancel=True 代码并允许无效数据存在。


选项 D:在 BeforeUpdate 事件中显式恢复旧值

Private mPrevMyTextBoxValue As Variant

Private Sub MyTextBox_AfterUpdate()
mPrevMyTextBoxValue = Me.MyTextBox.Value
End Sub
Private Sub MyTextBox_BeforeUpdate(Cancel As Integer)
Cancel = DataIsInvalid(Me.MyTextBox.Value)
If Cancel Then Me.MyTextBox.Value = mPrevMyTextBoxValue
'If Cancel Then Me.MyTextBox.Text = mPrevMyTextBoxValue
End Sub

尝试将先前的值分配给文本框的 .Value.Text 属性会导致相同的错误消息:

The macro or function set to the BeforeUpdate or ValidationRule property for this field is preventing {Program Name} from saving the data in the field.


选项 E:在 AfterUpdate 事件中显式恢复旧值

Private mPrevMyTextBoxValue As Variant

Private Sub MyTextBox_AfterUpdate()
If DataIsInvalid(Me.MyTextBox.Value) Then
Me.MyTextBox.Value = mPrevMyTextBoxValue
Me.MyTextBox.SetFocus
Else
mPrevMyTextBoxValue = Me.MyTextBox.Value
End If
End Sub

这非常接近期望的行为。不幸的是,不可能将焦点保持在控件上,因为 AfterUpdate 事件在处理 Tab/Enter 按键或鼠标单击事件之前运行。因此,即使我们尝试将焦点强制到正确的控件(通过上面的 .SetFocus 语句),程序也会立即将焦点转移到用户选择的控件。


在我看来,执行此操作的“正确”方法是使用控件的 .Undo 方法。但是,这不适用于未绑定(bind)的控件。这是一个莫名其妙的缺点,特别是考虑到 Escape 按键对未绑定(bind)字段执行此功能这一事实。

是否有更好的方法来做到这一点,还是我应该坚持使用 SendKeys

最佳答案

在谷歌上进入第 3 页后,我决定四处看看,看看在尝试选项 E 时会发生什么样的排序。下面是我能够用来将焦点“停留”在文本框上的最佳解决方法有问题。

Private mPrevMyTextBoxValue As Variant

Private Sub Text0_AfterUpdate()
If Me.Text0.Value = 0 Then
Me.Text0.Value = mPrevMyTextBoxValue
Me.Text12.SetFocus
Me.Text0.SetFocus
Else
mPrevMyTextBoxValue = Me.Text0.Value
End If
End Sub

0 模拟验证失败。似乎如果您在将焦点设置回您正在使用的文本框之前将焦点设置到其他内容,它将停留在那里。不幸的是,我没有答案。

编辑:我已经决定尝试对我的理论进行编程,以了解它是如何工作的。

Private blnGoToNextControl as Boolean

Private Function SetFocus(ctrl As control)

blnGoToNextControl = True
If ctrl.HasFocus = True Then
'Do nothing
Else
ctrl.HasFocus = True
blnGoToNextControl = False
End If
End Function

这是我对 SetFocus 函数工作原理的看法。因此,在 AfterUpdate 事件运行后,它会检查是否有标志转到下一个控件,并查看它是否设置为 false 并且不转到下一个控件。

显然编码很粗糙,但希望这能让我的理论得到理解?

关于ms-access - 替代 SendKeys "{Esc}"用于未绑定(bind)的文本框撤消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28815928/

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