![]() |
#1 |
Участник
|
Запрет редактирования поля
Привет всем.
Мне нужно запретить редактирование поля на гриде, при этом оставив возможность выбора значения из списка (lookup) Посмотрел постинг http://www.axforum.info/forums/showt...EF%E8%F1%EA%E0 но, если так сделать, то значение все равно вводить можно, просто оно не принимается, если было введено вручную Может есть способ запретить именно ручной ввод? Спасибо за ответы |
|
![]() |
#2 |
экс-модератор
|
поставьте validate(true) на релейшн по которому срабатывает лукап, и тогда, если руками будет введено значение, отсутствующее в лукапе, выкинется ошибка.
или вам не это надо? |
|
![]() |
#3 |
Moderator
|
Можно попробовать извращенный способ вот такого плана: stringedit с allowEdit=false, рядом с ним обычную кнопку, по которой вызывать лукап.
__________________
Андрей. |
|
![]() |
#4 |
Участник
|
да, это действительно извращение.
И мне надо на гриде. туда кнопки не добавляют. |
|
![]() |
#5 |
экс-модератор
|
а зачем вам, извините за любопытство, сабж?
в смысле, чем вам не подходит стандартное в таких случаях решение - давать пользователю вводить все что угодно, а в modified или validateWrite проверять и ругаться? |
|
![]() |
#6 |
Участник
|
![]()
>Мне нужно запретить редактирование поля на гриде, при этом оставив возможность выбора значения из списка (lookup)
Сделай его Enum ![]() |
|
![]() |
#7 |
Участник
|
и заполнять этот BaseEnum эелентами каждый раз перед лукапом? А если там код номенклатуры, к примеру - ОЧЕНЬ много записей.
Не покатит. Нужно какой то изврат - простой до уникальности. Если такое вообще можно сделать... |
|
![]() |
#8 |
Moderator
|
перекрыть textChange() на контроле и написать в нем this.text("");
Добавление: правда, в гриде это плохо работает...
__________________
Андрей. |
|
![]() |
#9 |
Участник
|
да, идея прекрасная, только в гриде действительно что-то не хочет.
![]() to maxsmirnov : нужно это, чтобы учесть RLS. Если написать значение, которое не попадает в список лукапа из-за RLS, вручную, то он его пропускает. ![]() |
|
![]() |
#10 |
Участник
|
И еще,
я вот пока так оставил, пока ничего нового не придумаю PHP код:
Поборол, добавил boolean lookupCalled; И его делаю true при лукапе и false после validate. Изврат, но звук пропал. |
|
![]() |
#11 |
экс-модератор
|
Цитата:
Изначально опубликовано kashperuk
нужно это, чтобы учесть RLS. Если написать значение, которое не попадает в список лукапа из-за RLS, вручную, то он его пропускает. ![]() собственно, и сейчас есть еще такая вещь как шаблон записи! так что рекомендую вам проверять введенные значения в validateWrite. |
|
![]() |
#12 |
Участник
|
> заполнять этот BaseEnum эелентами каждый раз перед лукапом?
Зачем? 1 раз заполнил - потом синхронизируй со справочником. Можно поле спрятать, а писать в него по выбранному значению Enum перекрыв write. Какая задача - такое и решение ![]() |
|
![]() |
#13 |
Участник
|
Можно еще такой экзотический способ, но зато без кодирования.
Делаете рядом 2 поля: первое - нормального размера, но отключаете кнопку лукапа (LookupButton=Never) и запрещаете ввод (AllowEdit=No). второе - маленькое, например width=14 (чтобы была видна только кнопка лукапа), а чтобы в поле не были видны первые 1-2 буквы значения - можно поиграться цветами фона и штрифта (не пробовал) либо поменять шрифт на экзотический (я например поставил MV Boli, там вместо русских букв всегда квадратик какой-то, но получилось стильно ![]() Ничего кодировать не надо - поля-то имеют один источник данных, так что в первом автоматом отображается то, что выбрали во втором через лукап. |
|
![]() |
#14 |
Снова балуюсь косаптой :)
|
![]()
Затем, что бараноподобные юзверы, как только видят доступное для ввода поле, скажем, значимый код номенклатуры - тут же лезут руками заполнять его той номенклатурой которую они ХОТЯТ, хотят видеть в данной строке (заявке, накладной и тп)! Будь то новая номенклатура или уже занесенная в справочник! Причем делают это ПОЧТИ ВСЕ.
Понятное дело, проблема снимается после 2-х минут обьяснений... но руководство убеждено, что система должна быть НАСТОЛЬКО интуитивно-понятной, защищенной от дурака и лакированной, что и без этих двухминутных разьяснений все должны сразу "сесть и работать". Без всякого обучения! ![]() Проблема решается на самом деле просто. Перекрывается метод TextChanged() контрола. Допустим, некая таблица Request имеет поле ItemId с дататипом ItemId. Тогда код этого метода будет выглядеть так: X++: public void textChange() { str xTxt; ; xTxt = this.text(); if (xTxt) { element.lock(); if (Request) { this.text(Request.ItemId); } info("Ввод нового товара в этом поле не предусмотрен. Для выбора существующего товара нажмите на кнопку выбора справа от поля."); element.unlock(); } else { super(); } } Данный метод плох тем, что для нормальных пользователей закрывает возможность быстрого поиска (вводя в поле "Ауди*" - чтоб сразу открывался отфильтрованный лукап, ограниченный номенклатурами, начинающимися на слово "Ауди". Но увы... бесплатно ничего не бывает ![]()
__________________
Бесты и регарды! |
|
|
За это сообщение автора поблагодарили: kashperuk (3), alex55 (1). |
![]() |
#15 |
Участник
|
У меня в AX 4.0 SP2 при попытке установить this.text("Some text") внутри TextChange() или же воспользоваться приведенным выше кодом происходит зацикливание (бесконечная рекурсия) поскольку this.text(par) вызывает TextChange()...
|
|