Share via


Динамические выпадающие списки

Добрый день, коллеги!

Очень часто возникает вопрос, а как сделать выпадающий список (picklist), значения в котором зависят от значений в другом выпадающем списке. Например, у нас и партнеры и клиенты относятся к организациям. Но, например, партнеры Microsoft могут обладать следующими статусами: Registered, Certified и Gold. В то время, как клиенты могут быть потенциальными или текущими. Соответственно, мы хотим, чтобы после того, как мы выбрали в поле "Тип отношений" значение "Партнер", в списке "Доп.информация" были доступны только 3 значения - Registered, Certified и Gold. Если же мы выбираем значение "Клиент", то в списке "Доп.информация" доступны только "Потенциальный" и "Текущий". Давайте посмотрим, как это можно реализовать с помощью событий OnChange и OnLoad.

Для начала, мы должны создать дополнительный атрибут - "Доп.информация" и в качестве типа атрибута указать Picklist. Также, нам надо добавить возможные значения для этого атрибута - Registered, Certified, Gold, Потенциальный, Текущий. Теперь сохраняем этот атрибут, выводим его на форму организации и публикуем изменения (в примере я удалил другие категории организаций, например, такие как: пресса, консультант и т.д.).

Теперь, нам надо написать обработчик OnChange для атрибута "Тип отношений". Открываем форму организации и выбираем свойства поля "Тип отношений". Переходим на закладку События и нажимаем на кнопку Правка для события OnChange. Делаем это событие активным и вводим следующий код:

var oCusType = crmForm.all.customertypecode;
var oNewInfo = crmForm.all.new_info;

oNewInfo .DeleteOption (1);
oNewInfo .DeleteOption (2);
oNewInfo .DeleteOption (3);
oNewInfo .DeleteOption (4);
oNewInfo .DeleteOption (5);

if ( oCusType .DataValue != null )
{
oNewInfo .Disabled = false;

    switch ( oCusType.DataValue )
{
case "3":
oNewInfo .AddOption ("Потенциальный" , 4);
oNewInfo .AddOption ("Текущий" , 5);
break;
case "5":
oNewInfo .AddOption ("Registered" , 1);
oNewInfo .AddOption ("Certified" , 2);
oNewInfo .AddOption ("Gold" , 3);
break;
}
}
else
{
oNewInfo.DataValue = null;
oNewInfo.Disabled = true;
}

И, чтобы все окончательно заработало, надо написать обработчик OnLoad для формы организации. Это необходимо для того, чтобы значения в выпадающих списках отображались корректно непосредственно после открытия формы. Открываем свойства формы и нажимаем на кнопку Правка для события OnLoad. Делаем событие также активным и вводим следующий код (здесь все проще, т.к. всю логику мы уже реализовали с помощью события OnChange и нам надо просто вызвать обработчик данного события. За это отвечает метод FireOnChange):

var p = crmForm.all.new_info.DataValue;

if (crmForm.all.customertypecode.DataValue != null)
{
crmForm.all.customertypecode.FireOnChange();
crmForm.all.new_info.DataValue = p;
}
else
{
crmForm.all.new_info.DataValue=null;
crmForm.all.new_info.Disabled = true;
}

 Все сохраняем, обязательно публикуем изменения и проверяем. Работает!