AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.07.2015, 12:58   #1  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
FormTreeControl удаление пустых нодов
Доброго времени суток!

Собственно сабж, необходимо удалить пустые ноды из FormTreeControl из кода.
Подскажите варианты...
Старый 28.07.2015, 17:09   #2  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Подскажите плиз как пройти по элементам дерева (как в .NET foreach treeitem)?
Старый 28.07.2015, 17:34   #3  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Посмотрите примеры в классе SysFormTreeControl (методы find*, expand*, collapse* ).
Старый 28.07.2015, 17:49   #4  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Смотрел, везде нужно задавать TreeItemIdx _treeItemIdx, а как узнать сколько на данный момент там нодов (что то вроде tree.items.Count) что бы потом цикл построить. Я перечитал все что нашел по данному контролу, никак понять не могу как с ним работать... В msdn описание очень скудное, а описание методов вообще отсутствует...
Старый 28.07.2015, 18:39   #5  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
В качестве корневого treeItemIdx можно использовать FormTreeControl.getRoot().
Дальше - цикл while (treeItemIdx) {...} по аналогии с методом expandTree. Выход из цикла произойдет когда метод getNextSibling() вернет ноль. Заранее всё количество нодов наверно узнать невозможно, то есть придется проверять каждого "соседа" на наличие дочерних узлов и рекурсивно выполнять аналогичный цикл, но уже не от корня, а от текущего узла.
За это сообщение автора поблагодарили: syl (1).
Старый 29.07.2015, 07:15   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
FormTreeItem.children() не оно?
Старый 29.07.2015, 13:40   #7  
makbeth is offline
makbeth
Участник
Аватар для makbeth
КОРУС Консалтинг
 
43 / 52 (2) ++++
Регистрация: 15.05.2007
Адрес: Санкт-Петербург
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
FormTreeItem.children() не оно?
Если не ошибаюсь, то этот метод просто ставит признак, который отвечает за отображение [+] для узла дерева. Если туда передать 0, то [+] не будет показан в контроле, иначе он будет показан всегда, даже если у узла дерева нет дочерних узлов.
Старый 29.07.2015, 15:45   #8  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Вопрос открытый

X++:
        idx = tables.getRoot();
        while(idx > 0)
        {  
            if(tables.getChild(idx) == 0)
                tables.delete(idx);
            idx = tables.getNextSibling(idx); //Тут всегда получает значение 0
        }
Я делаю фильтр для журнала базы данных (форма SysDatabaseLogWizard метод buildTableTree), фильтр работает, но остаются пустые ноды. Проблема в том что каждая нода (группа таблиц) с точки зрения системы является корневой.
Тоесть если изменить код на:
X++:
        while(idx > 0)
        {  
            if(tables.getChild(idx) == 0)
                tables.delete(idx);
            idx = tables.getRoot();
        }
Код будет отрабатывать пока не встретит непустую ноду, т.к. она не удалится будет вечный цикл. Неужели в данном контроле реально нету способа обойти все ноды (getNext()?)? что за контрол такой?)

В общем буду рад любым предложениям.
Старый 29.07.2015, 16:18   #9  
makbeth is offline
makbeth
Участник
Аватар для makbeth
КОРУС Консалтинг
 
43 / 52 (2) ++++
Регистрация: 15.05.2007
Адрес: Санкт-Петербург
В первом куске кода получается ноль потому, что сначала Вы узел удаляете, а потом для удаленного узла пытаетесь получить следующий на том же уровне. Нужно это делать перед удалением, т.к. 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  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Спасибо, все получилось.
Привожу код если кому понадобится:
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);
        }
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Удаление договора Янг DAX: Программирование 7 23.05.2011 14:07
axaptapedia: FormTreeControl AutoScrolling when draging over top and bottom Blog bot DAX Blogs 0 01.07.2009 13:05
FormTreeControl.singleSelection() axaLearner DAX: Программирование 2 28.06.2006 09:43
Корректное удаление проводки DreamCreator DAX: Программирование 7 25.05.2006 13:22
Удаление проекта Maxim Gorbunov DAX: Программирование 0 24.12.2001 23:04

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:40.