24.12.2010, 10:51 | #1 |
Участник
|
подмена BaseEnum
В стандарте AX2009 для семейного положения используется enum в котором понятия для разных полов объединены: женат/замужем
Закачик хочет видеть разные значения в зависимости от пола. Решил попробовать на форме сделать подмену списка. Создал два енума для мужчин и женщин, но как на форме при отображении и выборе сделать подмену? |
|
24.12.2010, 11:15 | #2 |
Administrator
|
С подменой тяжело - т.к. подмена еще может сработать на init-е формы, а дальше уже не сработает.
Можно попробовать сделать edit-метод (поле String), свой Base Enum, в котором будут все значения, а также lookup-кнопку, а в методе lookup вызвать метод EnumLookup_RU::lookup, (если у вас есть русская локализация) в который передается контейнер разрешенных для отображения значений лукапа. Соответственно - в edit-методе будет "конвертация" между Base Enum-ами. Конечно - это будет не очень красиво (по сравнению с исходным интерфейсом) - но формально позволит выполнить поставленную задачу. Добавлять в runtime значения в Combobox не советую - т.к. слетают индексы (т.е. фактически программист не в состоянии управлять числовым значением того или иного элемента списка). Плюс вы немного промучаетесь при отображении существующего значения в ComboBox-е - там могут иногда слетать значения (активное тестирование может выявить). Т.е. в конечном счете - данный бантик (а это можно только бантиком и назвать), на мой взгляд, не стоит тех мучений, которые нужно положить в его реализацию.
__________________
Возможно сделать все. Вопрос времени |
|
24.12.2010, 11:26 | #3 |
Участник
|
В ComboBox'e с семейным положением нужно поставить свойство AutoDeclaration в true, затем перекрыть метод modified() CheckBox'a с полом, как показано в коде ниже.
Свойство enumType первого CheckBox'a заполняете именем соответствующего enum'a, а данное свойство второго CheckBox'a оставляете пустым. X++: public boolean modified() { boolean ret; ret = super(); if(ret) { switch(this.valueStr()) { case enum2str(Gender::Male): MaritalStatus.enumType(enumnum(MaritalStatus_Men)); //enum семейного положения для мужчин break; case enum2str(Gender::Female): MaritalStatus.enumType(enumnum(MaritalStatus_Women));//enum семейного положения для женщин break; } } return ret; }
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 24.12.2010 в 11:32. |
|
24.12.2010, 11:33 | #4 |
Administrator
|
Цитата:
Если работает - тогда без проблем - так и нужно делать.
__________________
Возможно сделать все. Вопрос времени |
|
24.12.2010, 11:34 | #5 |
Участник
|
В Axapta 3 SP1 специально сделал тестовую формочку, проверил - работает.
__________________
С уважением, Александр. |
|
|
За это сообщение автора поблагодарили: sukhanchik (2). |
24.12.2010, 11:42 | #6 |
Administrator
|
О! Вспомнил - почему я так не делал. Если поле с енумом выводится в гриде - то естественно - у всех записей не может быть разный Base Enum при комбобоксе. Т.е. фактически - решение о подмене Enum-а хорошо - если контрол не будет вытянут в грид
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: samolalex (1). |
24.12.2010, 11:56 | #7 |
Участник
|
Согласен, т.к. "датабинд" при модификации поля с полом распространится на все записи в Grid'e.
В принципе, как мне кажется есть выход в создании справочника семейных статусов, где каждому значению семейного статуса будет соответствовать определенный пол. И уже после этого следует перекрывать метод lookup() для поля с семейным статусом из созданной таблицы-справочника, в котором отфильтровывались бы записи в зависимости от значения поля с полом. Может быть, я немного отдалился от первоначального вопроса, но данную задачу я, скорее всего, решил бы так.
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 24.12.2010 в 11:59. |
|
24.12.2010, 12:00 | #8 |
Administrator
|
Цитата:
Сообщение от samolalex
Согласен, т.к. датабинд при модификации поля с полом распространится на все записи в Grid'e.
В принципе, как мне кажется есть выход в создании справочника семейных статусов, где каждому значению семейного статуса будет соответствовать определенный пол. И уже после этого следует перекрывать метод lookup() для поля с семейным статусом из созданной таблицы-справочника, в котором фильтровались записи в зависимости от значения поля с полом. Может быть, я немного отдалился от первоначального вопроса, но данную задачу я, скорее всего, решил бы так.
__________________
Возможно сделать все. Вопрос времени |
|
24.12.2010, 12:03 | #9 |
Участник
|
Цитата:
Сообщение от sukhanchik
В данной конкретной - задаче - можно решить так, поскольку енумы с полом и семейным положением не влияют на функциональную логику работы системы. В общем-же случае - замена енума на справочник невозможна / нетривиальна, т.к. на конкретные значения енума может быть завязана конкретная логика, которую нельзя завязать на значения справочника.
__________________
С уважением, Александр. |
|
24.12.2010, 12:13 | #10 |
Участник
|
Цитата:
Но в стандарте используется енум. Поэтому и хочется перейти на стандарт, но со своими особенностями. |
|
24.12.2010, 12:15 | #11 |
Участник
|
А где дальше используется это значение "женат/замужем" ? Может проще было расширить enum: значение "женат/замужем" поменять на "женат", добавить новое "замужем", джобиком поменять значения для женщин.
|
|
|
За это сообщение автора поблагодарили: sukhanchik (2), samolalex (1). |
24.12.2010, 12:22 | #12 |
Участник
|
Цитата:
Получилось сделать как предложил samolalex, НО пришлось контрол отвязать от поля таблицы. И прийдется вручную присваивать значение полю. |
|
24.12.2010, 12:56 | #13 |
северный Будда
|
Строго говоря, нужно (в зависимости от пола) не два разных enuma, а два разных перевода значений енума. Т.е. нужно всегда выбирать NotMarried, но в грид выводить либо "Холост", либо "Не замужем".
Т.е. я бы сделал так: 1) Сделал на форме фильтрацию по данному енуму в заголовке. Там можно использовать стандартный перевод 2) Убрал бы само поле из отображения на форме (со всех закладок), а вместо него - выводил бы дисплей с соответствующим переводом 3) Ещё понадобится отдельная кнопка для ручной смены статуса. Там в диалоге уже можно использовать подменные енумы. P.S. Можно ещё покопаться в классе FormComboBoxControl. Может быть, там найдётся инструмент подмены меток.
__________________
С уважением, Вячеслав Последний раз редактировалось pitersky; 24.12.2010 в 12:59. |
|
|
За это сообщение автора поблагодарили: sukhanchik (2). |
24.12.2010, 13:11 | #14 |
Administrator
|
В этом случае опять все упрется в сложность отображения енума в гриде. Ну либо это уже будет не енум, а текстовое значение. Формальный минус - лишимся сортировки в форме. Правда не сильно критично - при наличии фильтрации и возможности сортировать по исходному полю
__________________
Возможно сделать все. Вопрос времени |
|
24.12.2010, 13:13 | #15 |
Administrator
|
Во! а это я тоже проходил. Но сразу не вспомнил. Тоже момент кстати. Т.е. едит-метод => без сортировки / фильтрации получился
__________________
Возможно сделать все. Вопрос времени |
|
24.12.2010, 14:04 | #16 |
северный Будда
|
В принципе, если к расширенному енуму создать EDT и на него навесить relation по значению пола, то можно получить отдельные списки по каждому полу. Другое дело, что такое расширение енума ИМХО неоправдано - состояние "в браке" от пола не зависит
__________________
С уважением, Вячеслав |
|
27.12.2010, 08:01 | #17 |
Мрачный тип
|
Переименовать метки у Enum на "состоит в браке/не состоит в браке"
В русском языке, слава богу, глаголы, являющиеся в фразе сказуемым к местоимению третьего лица, по родам не склоняются и почвы для дурных "хочушек" нет как таковой, равно как и не должно быть в таком случае никакого мозгоклюйства с заказчиками, имеющими сдвиг по фазе на почве гендерных различий.
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|