3

有没有办法禁止在文本框中输入多行条目(即,我想阻止我的用户执行 ctrl-enter 以获取换行符)?

4

7 回答 7

5

我能够使用 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
于 2008-08-21T15:32:53.083 回答
3

我以前做的方式(我最后一次在 Access 工作是在 97 年左右,所以我的记忆不太热)是引发一个按键事件并执行一个 VBA 函数。这与您在现代 Web 表单应用程序中使用 AJAX 建议文本框所做的方法类似,但我记得如果您的 Access 表单有其他经常发生的事件,例如整个表单对象上的 onMouseMove,它可能会出错。

于 2008-08-20T23:12:37.590 回答
3

使用 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 方法对用户来说更干净、更容易。

于 2008-09-15T22:50:10.080 回答
1

感谢伊恩和 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

屏幕闪烁永远不会成为问题,因为这些是已处理的事件,而不是持续轮询(并且每个控件都进一步限制了范围)。在我看来,这是一个无效的参数,因为每个文本编辑器都会在每次击键时执行一些代码。

谢谢

于 2015-03-23T19:00:45.347 回答
0

不完全确定这一点,您应该能够在渲染内容时删除换行符,或者甚至运行 vbscript 将其清除,您只需要检查 chr(13) 或 vbCrLf。

于 2008-08-20T22:18:12.150 回答
0

如果您不希望事件干扰,则可以将文本框的验证规则属性设置为

NOT LIKE "*"+Chr(10)+"*" OR "*"+Chr(13)+"*"

您可能还想设置验证文本来具体解释为什么 Access 会抛出错误框。

于 2008-08-22T15:52:32.000 回答
0

杰森的反应很好。只是为了添加它..

如果您想允许用户将文本框留空,您可以使用:

不像 " "+Chr(10)+" " 或 " "+Chr(13)+" " 或为空

于 2020-02-22T04:38:02.117 回答