|  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);
        } | 
|  |