禁用MS Access中的多行字段


3

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

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 
  0

这不是最好的解决方案,因为它使用了错误的事件,并且每次击键都会触发。控件的AfterUpdate事件更合适,并且只触发一次。 17 9月. 082008-09-17 03:01:15

+1

它为我工作。没有屏幕闪烁。在这种情况下,我希望防止最初的错误输入RATHER,而不是稍后尝试并筛选出来,并给用户一个钝的错误或改变他们对它们的输入。 17 9月. 082008-09-17 22:11:51


0

不完全确定那个,你应该可以在你渲染内容时删除换行符,或者甚至运行一个vbscript来清除它,你只需要检查chr(13)或vbCrLf。

  0

不是我想要的。这意味着我不得不在后台(而不是所见即所得)中使用用户的数据,或抛出错误,我会在后面提出很多解释。不过谢谢。 11 9月. 082008-09-11 14:30:24


3

我之前(以及我在Access中工作的最后一次是在97年左右,所以我的记忆并不那么热)的方式正在引发键盘事件并执行VBA功能。这与您在现代webform应用程序中使用AJAX建议文本框所做的操作类似,但是我记得,如果Access窗体的其他事件经常发生在整个窗体对象上的onMouseMove等其他事件,它可能会被绊倒。

  0

再次,每次击键都会首先发生KeyUp事件,这会导致屏幕闪烁。而且它效率低下 - 最好的事件仍然是用于编辑备忘录的控件的AfterUpdate事件,因为它只触发一次。 17 9月. 082008-09-17 03:02:34

  0

该评论应该是这样的:KeyUp事件每次击键都会引发... 17 9月. 082008-09-17 03:03:08


0

如果你不希望事件的干扰,可以设置有效性规则属性的文本框是

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

你可能还需要设置验证文本来具体解释Access为什么抛出一个错误框。

  0

不是我想要的,用户似乎从未理解验证文本。不过谢谢。 11 9月. 082008-09-11 14:31:42


2

使用KeyPress事件意味着每次用户键入时都会触发您的代码。这可能导致屏幕闪烁和其他问题(OnChange事件将是相同的)。

在我看来,你应该使用单个事件去除CrLf,并且正确的事件将是AfterUpdate。你会简单地这样做:

If InStr(Me!MyMemoControl, vbCrLf) Then 
    Me!MyMemoControl = Replace(Me!MyMemoControl, vbCrLf, vbNullString) 
    End If 

的使用注意事项访问全局常量的,vbCrLf(为CHR(10)& CHR(13))和vbNullString(零长度字符串)。

使用验证规则意味着您要向用户弹出一个丑陋的错误消息,但为他们提供了很少的工具来纠正问题。在我看来,AfterUpdate方法对用户来说更简洁,更简单。

  0

考虑到您在前端处理它,在数据库中添加验证规则也没有什么坏处。它甚至可能是一个福音,例如当用户试图通过Excel访问数据时,因为他们总是迟早做:) 10 10月. 082008-10-10 09:22:04

  0

但是,如果您放入验证规则,则必须使用BeforeUpdate事件而不是AfterUpdate。否则,您将弹出关于验证规则违规的Jet数据错误。 11 10月. 082008-10-11 20:28:01

+1

我理解你的论点。但是,在实践中,我的方法没有屏幕闪烁。此外,在用户进行更新后清理CrLf将会改变数据的表示方式。这反过来又会导致用户更加惊慌。我更喜欢当他们输入数据时,“他们看到的是他们所得到的”。 06 5月. 092009-05-06 15:19:03


0

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

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

谢谢