28.07.2015, 12:58 | #1 |
Участник
|
FormTreeControl удаление пустых нодов
Доброго времени суток!
Собственно сабж, необходимо удалить пустые ноды из FormTreeControl из кода. Подскажите варианты... |
|
28.07.2015, 17:09 | #2 |
Участник
|
Подскажите плиз как пройти по элементам дерева (как в .NET foreach treeitem)?
|
|
28.07.2015, 17:34 | #3 |
Дмитрий Ерин
|
Посмотрите примеры в классе SysFormTreeControl (методы find*, expand*, collapse* ).
|
|
28.07.2015, 17:49 | #4 |
Участник
|
Смотрел, везде нужно задавать TreeItemIdx _treeItemIdx, а как узнать сколько на данный момент там нодов (что то вроде tree.items.Count) что бы потом цикл построить. Я перечитал все что нашел по данному контролу, никак понять не могу как с ним работать... В msdn описание очень скудное, а описание методов вообще отсутствует...
|
|
28.07.2015, 18:39 | #5 |
Дмитрий Ерин
|
В качестве корневого treeItemIdx можно использовать FormTreeControl.getRoot().
Дальше - цикл while (treeItemIdx) {...} по аналогии с методом expandTree. Выход из цикла произойдет когда метод getNextSibling() вернет ноль. Заранее всё количество нодов наверно узнать невозможно, то есть придется проверять каждого "соседа" на наличие дочерних узлов и рекурсивно выполнять аналогичный цикл, но уже не от корня, а от текущего узла. |
|
|
За это сообщение автора поблагодарили: syl (1). |
29.07.2015, 07:15 | #6 |
Участник
|
FormTreeItem.children() не оно?
|
|
29.07.2015, 13:40 | #7 |
Участник
|
Если не ошибаюсь, то этот метод просто ставит признак, который отвечает за отображение [+] для узла дерева. Если туда передать 0, то [+] не будет показан в контроле, иначе он будет показан всегда, даже если у узла дерева нет дочерних узлов.
|
|
29.07.2015, 15:45 | #8 |
Участник
|
Вопрос открытый
X++: idx = tables.getRoot(); while(idx > 0) { if(tables.getChild(idx) == 0) tables.delete(idx); idx = tables.getNextSibling(idx); //Тут всегда получает значение 0 } Тоесть если изменить код на: X++: while(idx > 0) { if(tables.getChild(idx) == 0) tables.delete(idx); idx = tables.getRoot(); } В общем буду рад любым предложениям. |
|
29.07.2015, 16:18 | #9 |
Участник
|
В первом куске кода получается ноль потому, что сначала Вы узел удаляете, а потом для удаленного узла пытаетесь получить следующий на том же уровне. Нужно это делать перед удалением, т.к. idx удаленного узла становится недействительным.
Что есть "пустая нода"? Та, у которой нет дочерних? Ведь этак проще всего просто удалить все элементы, т.к. удаляя "пустую" по такому критерию на разных уровнях, постепенно придем к тому, что все будут пустыми. Все элементы можно обойти рекурсивно (об этом писали выше): X++: void iterate(TreeItemIdx _idx) { while (idx) { // ... iterate(tree.getChild(_idx)); // ... _idx = tree.getNextSibling(_idx); } } ; iterate(tree.getRoot()); |
|
29.07.2015, 16:34 | #10 |
Участник
|
Спасибо, все получилось.
Привожу код если кому понадобится: X++: it = tables.getRoot(); while(it > 0) { if(tables.getChild(it) == 0) { idx = it; it = tables.getNextSibling(it); tables.delete(idx); } else it = tables.getNextSibling(it); } |
|