|  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()...
		 | 
|  |