24.01.2005, 13:20 | #1 |
Участник
|
Запрет редактирования поля
Привет всем.
Мне нужно запретить редактирование поля на гриде, при этом оставив возможность выбора значения из списка (lookup) Посмотрел постинг http://www.axforum.info/forums/showt...EF%E8%F1%EA%E0 но, если так сделать, то значение все равно вводить можно, просто оно не принимается, если было введено вручную Может есть способ запретить именно ручной ввод? Спасибо за ответы |
|
24.01.2005, 13:37 | #2 |
экс-модератор
|
поставьте validate(true) на релейшн по которому срабатывает лукап, и тогда, если руками будет введено значение, отсутствующее в лукапе, выкинется ошибка.
или вам не это надо? |
|
24.01.2005, 13:39 | #3 |
Moderator
|
Можно попробовать извращенный способ вот такого плана: stringedit с allowEdit=false, рядом с ним обычную кнопку, по которой вызывать лукап.
__________________
Андрей. |
|
24.01.2005, 13:44 | #4 |
Участник
|
да, это действительно извращение.
И мне надо на гриде. туда кнопки не добавляют. |
|
24.01.2005, 13:56 | #5 |
экс-модератор
|
а зачем вам, извините за любопытство, сабж?
в смысле, чем вам не подходит стандартное в таких случаях решение - давать пользователю вводить все что угодно, а в modified или validateWrite проверять и ругаться? |
|
24.01.2005, 13:56 | #6 |
Участник
|
>Мне нужно запретить редактирование поля на гриде, при этом оставив возможность выбора значения из списка (lookup)
Сделай его Enum ))) |
|
24.01.2005, 13:58 | #7 |
Участник
|
и заполнять этот BaseEnum эелентами каждый раз перед лукапом? А если там код номенклатуры, к примеру - ОЧЕНЬ много записей.
Не покатит. Нужно какой то изврат - простой до уникальности. Если такое вообще можно сделать... |
|
24.01.2005, 14:01 | #8 |
Moderator
|
перекрыть textChange() на контроле и написать в нем this.text("");
Добавление: правда, в гриде это плохо работает...
__________________
Андрей. |
|
24.01.2005, 14:07 | #9 |
Участник
|
да, идея прекрасная, только в гриде действительно что-то не хочет.
to maxsmirnov : нужно это, чтобы учесть RLS. Если написать значение, которое не попадает в список лукапа из-за RLS, вручную, то он его пропускает. |
|
24.01.2005, 14:22 | #10 |
Участник
|
И еще,
я вот пока так оставил, пока ничего нового не придумаю PHP код:
Поборол, добавил boolean lookupCalled; И его делаю true при лукапе и false после validate. Изврат, но звук пропал. |
|
24.01.2005, 14:28 | #11 |
экс-модератор
|
Цитата:
Изначально опубликовано kashperuk
нужно это, чтобы учесть RLS. Если написать значение, которое не попадает в список лукапа из-за RLS, вручную, то он его пропускает. собственно, и сейчас есть еще такая вещь как шаблон записи! так что рекомендую вам проверять введенные значения в validateWrite. |
|
24.01.2005, 14:40 | #12 |
Участник
|
> заполнять этот BaseEnum эелентами каждый раз перед лукапом?
Зачем? 1 раз заполнил - потом синхронизируй со справочником. Можно поле спрятать, а писать в него по выбранному значению Enum перекрыв write. Какая задача - такое и решение |
|
25.02.2005, 13:55 | #13 |
Участник
|
Можно еще такой экзотический способ, но зато без кодирования.
Делаете рядом 2 поля: первое - нормального размера, но отключаете кнопку лукапа (LookupButton=Never) и запрещаете ввод (AllowEdit=No). второе - маленькое, например width=14 (чтобы была видна только кнопка лукапа), а чтобы в поле не были видны первые 1-2 буквы значения - можно поиграться цветами фона и штрифта (не пробовал) либо поменять шрифт на экзотический (я например поставил MV Boli, там вместо русских букв всегда квадратик какой-то, но получилось стильно ) ) Ничего кодировать не надо - поля-то имеют один источник данных, так что в первом автоматом отображается то, что выбрали во втором через лукап. |
|
19.04.2007, 21:15 | #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). |
29.11.2007, 08:09 | #15 |
Участник
|
У меня в AX 4.0 SP2 при попытке установить this.text("Some text") внутри TextChange() или же воспользоваться приведенным выше кодом происходит зацикливание (бесконечная рекурсия) поскольку this.text(par) вызывает TextChange()...
|
|