在MS Access中禁用多行字段

3
有没有办法禁用在文本框中输入多行条目(即,我想阻止用户使用Ctrl-Enter换行)?
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

这绝不是最佳解决方案,因为它使用了错误的事件,并且每次按键都会触发。控件的AfterUpdate事件更加合适,只会触发一次。 - David-W-Fenton
1
它对我来说是有效的。没有屏幕闪烁。在这种情况下,我想要最初防止错误输入,而不是后来尝试筛选它们并给用户一个晦涩的错误或更改他们的输入。 - BIBD
我将此解决方案与AfterUpdate解决方案结合使用,因为后者还可以处理通过复制和粘贴插入的换行符。 - Jörg Brenninkmeyer

3

我以前的做法(最后一次使用Access是在97年左右,所以我的记忆不太好)是触发一个键盘抬起事件并执行一个VBA函数。这类似于现代Web表单应用程序中使用AJAX建议文本框的方法,但我记得如果你的Access表单有其他频繁发生的事件,比如鼠标在整个表单对象上移动,它可能会出现问题。


KeyUp事件会随着每次按键而触发,这可能会导致屏幕闪烁。而且它非常低效 -- 对于此操作来说,最好的事件仍然是您用于编辑备忘录的控件的AfterUpdate事件,因为它只会触发一次。 - David-W-Fenton

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方法更加清晰简洁,对用户更加友好。

考虑到您正在前端处理它,将验证规则添加到数据库中也没有任何损害。这甚至可能是一个福音,例如当用户尝试通过Excel访问数据时,因为他们迟早都会这样做 :) - onedaywhen
但是,如果您放置验证规则,则必须使用BeforeUpdate事件而不是AfterUpdate。否则,您将弹出有关验证规则违规的Jet数据错误。 - David-W-Fenton
1
我理解你的观点。然而,在实践中,我的方法没有屏幕闪烁。此外,在用户更新后删除 CrLf 会改变数据的表示方式,与他们输入的方式不同。这反过来会导致用户抱怨更多。我更喜欢当他们输入数据时,“所见即所得”。 - BIBD

1
感谢Ian和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

屏幕闪烁不应该成为问题,因为这些是处理事件,而不是常量轮询(而且它是每个控件进一步限制范围)。对我来说看起来像是一个无效的论点,因为每个文本编辑器都在执行每个按键的一些代码。
谢谢。

0

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

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

您可能还希望将验证文本设置为具体解释为何出现错误框。


不太符合我的期望,用户似乎从未理解验证文本。谢谢。 - BIBD

0

Jason的回答很好。只是补充一下...

如果你想让用户可以留空文本框,你可以使用这个:

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


0

对于这个问题我不是完全确定,但是当你渲染内容时应该能够删除换行符,或者运行一个VB脚本来清除它,你只需要检查chr(13)或vbCrLf即可。


不太是我想要的。这意味着我必须在后台与用户的数据进行操作(非所见即所得),或者会出现一些错误,而我本来打算会有很多解释的。不过还是谢谢。 - BIBD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接