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


3

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

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 сен. 082008-09-17 03:01:15

+1

Это работает для меня. Не мерцает экран. И в этом случае я хочу предотвратить неудачный ввод изначально RATHER, чем попытаться его пропустить позже и либо дать пользователю тупые ошибки, либо изменить их ввод на них. 17 сен. 082008-09-17 22:11:51

  0

Я использую это решение в сочетании с [AfterUpdate solution] (https://stackoverflow.com/a/67730/360480), потому что последний также адресует разрывы строк, вставленные с помощью copy & paste. 07 ноя. 172017-11-07 10:52:11


0

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

  0

Не совсем то, что я хотел. Это означает, что мне нужно обезьяну с данными пользователя в фоновом режиме (а не WYSIWYG) или бросать ошибки, которые я бы поместил много объяснений. Спасибо хоть. 11 сен. 082008-09-11 14:30:24


3

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

  0

Опять же, событие KeyUp сначала с каждым нажатием клавиши, и это может привести к мерцающему экрану. И это просто неэффективно - лучшим событием для этого является событие AfterUpdate элемента управления, которое вы используете для редактирования заметки, потому что оно срабатывает только один раз. 17 сен. 082008-09-17 03:02:34

  0

Этот комментарий должен быть прочитан: Событие KeyUp FIRES с каждым нажатием клавиши ... 17 сен. 082008-09-17 03:03:08


0

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

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

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

  0

Не совсем то, что я хотел, пользователь никогда не понимает текст проверки. Спасибо хоть. 11 сен. 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 окт. 082008-10-10 09:22:04

  0

Но если вы ввели правило проверки, вы должны использовать событие BeforeUpdate вместо AfterUpdate. В противном случае вы получите ошибку данных Jet о нарушении правила проверки. 11 окт. 082008-10-11 20:28:01

+1

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

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

Thanks