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

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

20.08.2008 22:02:38
7 ОТВЕТОВ

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

0
20.08.2008 22:18:12
Не совсем то, что я хотел. Это означает, что мне приходится манипулировать данными пользователя в фоновом режиме (не WYSIWYG) или выкидывать ошибки, которые я бы объяснил. Спасибо хоть.
BIBD 11.09.2008 14:30:24

То, как я это делал раньше (а последний раз, когда я работал в Access, было где-то в 97-м, поэтому у меня не так жарко) вызывало событие key-up и выполняло функцию VBA. Этот метод аналогичен тому, что вы делаете с текстовым полем подсказки AJAX в современном приложении веб-формы, но, насколько я помню, он может сработать, если в вашей форме доступа есть другие события, которые часто происходят, например onMouseMove, по всему объекту формы.

3
20.08.2008 23:12:37
Опять же, событие KeyUp сначала при каждом нажатии клавиши, и это может привести к мерцанию экрана. И это просто неэффективно - лучшим событием для этого по-прежнему остается событие AfterUpdate элемента управления, который вы используете для редактирования заметки, потому что она срабатывает только один раз.
David-W-Fenton 17.09.2008 03:02:34
РЕШЕНИЕ

Я смог сделать это с помощью события 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
5
21.08.2008 15:32:53
Это ни в коем случае не лучшее решение, потому что оно использует неправильное событие и срабатывает при каждом нажатии клавиши. Событие AfterUpdate элемента управления является более подходящим и запускается только один раз.
David-W-Fenton 17.09.2008 03:01:15
Это работает для меня. Нет мерцания экрана. И в этом случае я хочу предотвратить неправильный ввод ПЕРВОГО, а не пытаться отсеять его позже и либо дать пользователю тупую ошибку, либо изменить свой ввод на них.
BIBD 17.09.2008 22:11:51
Я использую это решение в сочетании с решением AfterUpdate, поскольку последнее также учитывает разрывы строк, вставленные с помощью копирования и вставки.
Jörg Brenninkmeyer 7.11.2017 10:52:11

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

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

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

0
22.08.2008 15:52:32
Не совсем то, что я хотел, пользователь никогда не понимает текст проверки. Спасибо хоть.
BIBD 11.09.2008 14:31:42

Использование события 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 намного чище и проще для пользователей.

3
10.03.2009 04:14:16
Учитывая, что вы обрабатываете его во внешнем интерфейсе, добавление правила проверки в базу данных также не повредит. Это может быть даже благом, например, когда пользователь пытается получить доступ к данным через Excel, как они всегда делают раньше или позже :)
onedaywhen 10.10.2008 09:22:04
Но если вы добавите правило проверки, вы должны использовать событие BeforeUpdate вместо AfterUpdate. В противном случае вы получите ошибку данных Jet о нарушении правила проверки.
David-W-Fenton 11.10.2008 20:28:01
Я понимаю ваш аргумент. Однако на практике у меня нет мерцания экрана при использовании моего метода. Кроме того, удаление CrLf после того, как пользователь сделал обновления, изменит способ представления данных по сравнению с тем, как они его вводили. Что, в свою очередь, приведет к усилению криков пользователей. Я предпочитаю, чтобы, когда они вводят данные, «то, что они видят, это то, что они получают».
BIBD 6.05.2009 15:19:03

Спасибо Ян и 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

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

Спасибо

1
23.03.2015 20:51:17

Ответ Джейсона работает хорошо. Просто чтобы добавить к этому ..

Если вы хотите разрешить пользователю оставлять текстовое поле пустым, вы можете использовать это:

Не нравится " " + Chr (10) + " " Or " " + Chr (13) + " " Or Null

0
22.02.2020 04:38:02