Интересно, можно ли использовать этот же контрол, только с иерархическим списком в виде дерева? Пример: Дерево1-Узел(a), Узел(b), Узел(c)и Дерево2-Узел(x), Узел(y), Узел(z). Узел(a) в Дереве1 надо добавить к Дереву2, причем нужна возможность добавлять как Sub и как Parent. Как можно решить эту задачу?
Вообще, была мысль нарисовать просто два дерева с необходимыми кнопками и радиобатонами Add Sub и Add Parent, но как-то неюзабельно получается.
Есть толковые мысли или кто-нить делал подобное?
Здравствуйте, Passer_by, Вы писали:
P_>Как можно решить эту задачу?
Добавляем выбранные элементы всегда в конец дерева и даем возможность пользователю настроить получившуюся "заготовку" так, как ему надо. Настройку проще всего сделать с помощью кнопок "вниз", "вверх", "вправо", "влево". Кнопки "вниз"/"вверх" двигают ветки по вертикали, в пределах текущего уровня иерархии; "вправо"/влево" — по горизонтали, перемещая выбранные ветки по всем возможным уровням иерархии.
Кроме того, твою задачу можно решить с помощью drag-and-drop, но это сложнее.
Здравствуйте, Passer_by, Вы писали:
P_>Интересно, можно ли использовать этот же контрол, только с иерархическим списком в виде дерева? Пример: Дерево1-Узел(a), Узел(b), Узел(c)и Дерево2-Узел(x), Узел(y), Узел(z). Узел(a) в Дереве1 надо добавить к Дереву2, причем нужна возможность добавлять как Sub и как Parent. Как можно решить эту задачу?
Зависит от содержательной структуры дерева.
Если структура предельно обобщённая, то просто выбираешь узел куда, выбираешь поддерево откуда, и вставляешь поддерево в это место.
Причём если порядок узлов не имеет значения либо фиксирован (узлы сортируются), то добавлять можно как дочерний от целевого. А если порядок пользовательский, то лучше добавлять на этот же уровень перед целевым узлом (тогда в шаттле в коллекции дочерних узлов должен быть один фиктивный концевой узел).
Как добавлять родительский узел — это мне непонятно. Может быть, встраиваться между целевым узлом и его родителем, создавая ещё один уровень иерархии?
Возможно, что здесь пригодится идея клипборда, обобщающая идею шаттла. (Заимствую из программ видеомонтажа и вёрстки).
То есть, имеется документ (дерево) и стол для клипов вокруг. Со стола можно брать клип и вставлять в документ, а можно отдирать кусок документа и перекладывать на стол.
Тогда операция вращения дерева (изменение уровня иерархии) выполняется в 3 приёма:
— удалить данное поддерево
— добавить другое поддерево — если мы собрались перенести вниз
— вставить наше поддерево в соответсвующий узел свежедобавленного поддерева
Если же иерархическая структура фиксированная, например, "жанр — исполнитель — альбом — трек", то и выдумывать ничего не надо. Находясь на соответсвующем уровне, получаешь соответсвующий список возможных вставок.
А ещё круче, когда наполнение каждого узла заранее известно. Например, это атрибуты форматирования текста, не имеющего каскадную структуру (т.е. не html, а rtf).
Может быть, даже дерево не стоит визуализировать.
Могут быть ещё варианты задач — я к тому, что нужно исходить из задачи. А не из внутренней структуры данных.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Passer_by, Вы писали:
P_>>Есть толковые мысли или кто-нить делал подобное? S>Толковых — нет. Подобное — вот.
Всем респект за ответы. Особое спасибо Sinclair — наглядно и удобно на мой взгляд, как всегда Вы скромничаете Такая реализация нам очень подходит. Структура дерева фиксированная.
А так же модератору, который вынес пост как отдельную тему.