有没有办法禁止在文本框中输入多行条目(即,我想阻止我的用户执行 ctrl-enter 以获取换行符)?
7 回答
我能够使用 KeyPress 事件来做到这一点。这是代码示例:
Private Sub SingleLineTextBox_ KeyPress(ByRef KeyAscii As Integer)
If KeyAscii = 10 _
or KeyAscii = 13 Then
'10 -> Ctrl-Enter. AKA ^J or ctrl-j
'13 -> Enter. AKA ^M or ctrl-m
KeyAscii = 0 'clear the the KeyPress
End If
End Sub
我以前做的方式(我最后一次在 Access 工作是在 97 年左右,所以我的记忆不太热)是引发一个按键事件并执行一个 VBA 函数。这与您在现代 Web 表单应用程序中使用 AJAX 建议文本框所做的方法类似,但我记得如果您的 Access 表单有其他经常发生的事件,例如整个表单对象上的 onMouseMove,它可能会出错。
使用 KeyPress 事件意味着您的代码将在每次用户键入时触发。这可能导致屏幕闪烁和其他问题(OnChange 事件将是相同的)。
在我看来,您应该使用单个事件来去除 CrLf,正确的事件应该是 AfterUpdate。你只需这样做:
If InStr(Me!MyMemoControl, vbCrLf) Then
Me!MyMemoControl = Replace(Me!MyMemoControl, vbCrLf, vbNullString)
End If
请注意 Access 全局常量 vbCrLf(用于 Chr(10) 和 Chr(13))和 vbNullString(用于零长度字符串)的使用。
使用验证规则意味着您将向用户弹出一条丑陋的错误消息,但几乎没有为他们提供纠正问题的工具。在我看来,AfterUpdate 方法对用户来说更干净、更容易。
感谢伊恩和 BIBD。我根据您的答案创建了一个可重复使用的公共子。
Public Sub PreventNewlines(ByRef KeyAscii As Integer)
If KeyAscii = 10 Or KeyAscii = 13 Then KeyAscii = 0
End Sub
Private Sub textbox_KeyPress(KeyAscii As Integer)
Call PreventNewlines(KeyAscii)
End Sub
屏幕闪烁永远不会成为问题,因为这些是已处理的事件,而不是持续轮询(并且每个控件都进一步限制了范围)。在我看来,这是一个无效的参数,因为每个文本编辑器都会在每次击键时执行一些代码。
谢谢
不完全确定这一点,您应该能够在渲染内容时删除换行符,或者甚至运行 vbscript 将其清除,您只需要检查 chr(13) 或 vbCrLf。
如果您不希望事件干扰,则可以将文本框的验证规则属性设置为
NOT LIKE "*"+Chr(10)+"*" OR "*"+Chr(13)+"*"
您可能还想设置验证文本来具体解释为什么 Access 会抛出错误框。
杰森的反应很好。只是为了添加它..
如果您想允许用户将文本框留空,您可以使用:
不像 " "+Chr(10)+" " 或 " "+Chr(13)+" " 或为空