Формулировка проблемы: необходима возможность связывать компоненты форм типа «Выпадающий список» таким образом, чтобы можно было фильтровать доступные значения в одном (связанном) компоненте на основе того, какое значение выбрано в другом (главном). Пример: два списка .
список с типами операционных систем: UNIX-like, Windows, другое;
список с конкретными ОС: Debian, RHEL, Windows XP, Windows 7, MenuetOS;
Необходимо, чтобы при выбранном в списке 1 значении UNIX-like во втором списке должны быть доступны только значения Debian, RHEL; и так далее.
Решение: необходимо реализовать возможность связывания компонентов типа «Выпадающий список». Для каждого такого компонента вводится настройка «Связь с компонентом», при активации которой становится доступным к выбору выпадающий список идентификаторов компонентов типа «Выпадающий список» (настраиваемый компонент в этот список не входит):
Компонент, для которого активирована эта настройка, будем называть «зависимым», а компонент, который в ней выбран (компонент, с которым связан зависимый) — «главным».
У зависимого компонента в диалоге редактирования элементов, в дополнение к «Наименованию» и «Значению», появляется третье поле — «Фильтр». Это поле доступно как в режиме ручного ввода, так и в случае выбора справочника:
Механизм работы связи заключается в следующем: значение выбранного в главном компоненте элемента используется для того, чтобы определить, какие элементы доступны к выбору в зависимом компоненте — доступными к выбору из зависимого списка должны быть только те элементы, значение поля «Фильтр» которых (полностью, строково) совпадает со значением поля «Значение» выбранного в главном списке элемента.
Фильтрация элементов зависимого списка должна производиться при каждом изменении выбранного элемента в главном списке, включая изменения, вызванные сработавшим механизмом сопоставления полей форм.
Если выбранный в главном списке элемент не соответствует ни одному из элементов зависимого списка, иначе говоря, ни один элемент зависимого списка не имеет значения поля «Фильтр», равного значению поля «Значение» выбранного в главном списке элемента, то в этом случае в зависимом списке не доступен к выбору ни один элемент, т. е. зависимый список будет пустым.
Реализуемая возможность должна допускать создание цепочек связанных компонентов, например, чтобы можно было связать следующие списки (в скобках указаны столбцы, столбец фильтра выделен курсивом, столбец значения — полужирным):
«Царство» (название, код царства) → «Тип» (название, код типа, код царства) → «Класс» (название, код класса, код типа) → Отряд (название, код отряда, код класса) → Семейство (название, код семейства, код отряда)→ Род (название, код рода, код семейства) → Вид (название, код вида, код рода)
и подобные им.