Отключение многострочных полей в MS Access

StackOverflow https://stackoverflow.com/questions/18955

  •  09-06-2019
  •  | 
  •  

Вопрос

Есть ли способ отключить ввод многострочных записей в текстовое поле (т. Е. Я бы хотел запретить своим пользователям нажимать ctrl-enter для получения новой строки)?

Это было полезно?

Решение

Я смог сделать это при использовании события нажатия клавиши.Вот пример кода:

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-м, так что моя память не такая уж и горячая), заключался в вызове события key-up и выполнении функции VBA.Это метод, аналогичный тому, что вы делаете с текстовым полем AJAX suggest в современном приложении webform, но, насколько я помню, он может сработать, если в вашей форме доступа есть другие события, которые, как правило, происходят часто, такие как OnMouseMove по всему объекту формы.

Использование события нажатия клавиши означает, что ваш код будет срабатывать каждый раз, когда пользователь вводит текст.Это может привести к мерцанию экрана и другим проблемам (событие 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 намного чище и проще для пользователей.

не совсем уверен в этом, но вы должны иметь возможность удалять разрывы строк при рендеринге содержимого или даже запускать vbscript, чтобы очистить его, вам просто нужно проверить наличие chr (13) или vbCrLf.

Если вы не хотите, чтобы событие вмешивалось, вы можете настроить свойство правила проверки, чтобы текстовое поле было

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

Вероятно, вы также захотите задать текст проверки, чтобы конкретно объяснить, почему Access выдает окно с ошибкой.

Спасибо Иэну и БИБДУ.Я создал общедоступный подраздел на основе вашего ответа, который можно использовать повторно.

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

Мерцание экрана никогда не должно быть проблемой, так как это обрабатываемые события, а не постоянный опрос (и это для каждого элемента управления еще больше ограничивает область действия).Мне кажется, это недопустимый аргумент, поскольку каждый текстовый редактор выполняет некоторый код при каждом нажатии клавиши.

Спасибо

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top