Запрет на ручной ввод или его ограничение может быть установлен по разным причинам, но основной является - предотвращение ввода ошибочных данных и опечаток.
Но как быть, если нужно и ограничение, и возможность взаимодействия?
Сегодня поделимся определенной "фичей" позволяющей установить запрет на ручной ввод в ComboBox, но при этом оставить возможность вносить изменения и осуществлять выбор.
▶️ Пример исходных данных
В качестве примера рассмотрим форму предыдущего обзора
содержащую следующие ComboBox:
- ComboBox1 - список формируется из данных столбца В
- ComboBox2 - зависимый ComboBox1 выпадающий список, формируется из данных столбца С
- ComboBox3 - список из справочника (базы данных)
🎯 Требуется:
- создать связи между двумя ComboBox2 и ComboBox3
- запретить ручной ввод во всех ComboBox (разрешить выбор только из выпадающего списка);
- настроить замену данных с использованием справочника.
▶️ Обзор свойств
Основными свойствами ComboBox которые позволяют установить определенные ограничения на взаимодействие с данным элементом являются:
- TextLength (Длина текста): применяется к объектам, таким как текстовые поля, и определяет максимально допустимую длину текста, которую можно ввести в это поле. Если свойство TextLength установлено на определенное значение, то пользователь не сможет ввести в поле больше символов, чем задано этим свойством.
- Enabled (Включено): применяется к элементам управления, таким как кнопки или текстовые поля, и определяет, активен ли данный элемент для взаимодействия с пользователем. Когда свойство Enabled установлено в True, элемент активен и пользователь может с ним взаимодействовать. Если Enabled равно False, элемент становится неактивным и недоступным для пользовательского ввода.
- Locked (Заблокировано): свойство применяется к ячейкам и диапазонам и позволяет управлять доступом к их содержимому. Когда установлено в True, содержимое ячейки или диапазона становится заблокированным и нельзя его изменить без соответствующего снятия блокировки.
- Style (Стиль): применяется к объектам, таким как ячейки или диапазоны, и определяет внешний вид объекта, включая формат шрифта, цвет заливки, границы и многое другое. С помощью Style можно быстро применить заранее заданный набор форматирования к объекту.
- MatchRequired (Требуется совпадение): свойство связано с валидацией данных в Excel. Когда установлено в True для правила валидации данных, это означает, что введенное значение должно точно совпадать с одним из допустимых значений, заданных в правиле валидации. Если MatchRequired равно False, то значение будет считаться допустимым, если оно соответствует какому-либо из заданных условий, даже если не совпадает точно.
▶️ Ограничение взаимодействия. Подбор методов
Способ установки взаимной связи между элементами управления обычно выглядит так:
Если никаких ограничений нет, то код срабатывает безупречно:
А теперь, покажем на примере, что произойдет при установке ограничений.
Напомним, что ComboBoх3 уже имеет ограничение:
А потому, используя описанные выше способы добавим ограничение для ComboBoх2.
🔘 Способ 1: Используем свойство Locked
Установите Locked в True - это предотвратит редактирование:
А теперь, протестируем результат. Установленное ограничение не даст ошибку в коде, но и не даст возможность выбора из выпадающего списка ComboBoх2, а как следствие будет только дублировать запись из ComboBoх3 в ComboBoх2:
🔘 Способ 2: Используем свойство Enabled.
Установите Enabled в False - это вовсе блокирует выбор (флажок элемента управления становиться не активным и пользователь не может сделать выбор:
Аналогично предыдущему примеру будет доступно только дублирование записи:
🔘 Способ 3: свойство Style в fmStyleDropDownList
Это позволит делать выбор в ComboBoх2 и ограничит ручной ввод:
Но макрос будет завершен ошибкой:
На этом мы остановимся, но Вы можете поэкспериментировать, и поделиться результатом в комментариях.
😉
▶️ Решение: как установить взаимную связь ComboBox, если установлен запрет на ручной ввод
Итак, чтобы решить задачу выполним следующее:
1. Для ComboBox2 установим в коде ограничение на ввод с клавиатуры:
2. Глобальные переменные: Объявим массив для хранения выбранных значений
3. Для ComboBox3 определим действие на событие _Change определяющее связь с ComboBox2:
4. Для события Initialize внесем изменения:
4. Чтобы восстановить значение в ComboBox2 после замены добавим строку:
Этот "обходной" метод запретит ручной ввод, но одновременно позволит:
- хранить выбранные значения в массиве;
- обновлять ComboBox2 с использованием этого массива;
- пользователю выбирать значения из выпадающего списка ComboBox3 и добавлять их в ComboBox2 (в т.ч. одно и то же значение несколько раз)
▶️ Корректировка значений с использованием данных справочника
Теперь, когда связь между источником данных и формами установлена, добавлена возможность вносить изменения уже не в ручную, а используя актуальные данные справочника можно протестировать результат.
➡️ Для этого:
- определим заказ и укажем Исполнителя:
- выберем нового исполнителя из справочника:
- выполним замену:
Как видите все работает, но при этом ни в один ComboBox пользователь не может вносить данные с клавиатуры 😉.
А на этом сегодня все 👏
В следующих обзорах обсудим: как установить обратную связь между ComboBox и настроить вариативный поиск и изменение данных. Оставайтесь на связи 💖
📍 Рекомендуемые статьи 🔽