Как написать рекурсивную функцию для создания древовидного представления данных в окне данных?

У меня есть данные родитель-потомок в окне данных из таблицы mytab(id, pid....) Затем я хочу использовать данные для создания дерева в виде дерева.

Я пытаюсь использовать рекурсивную функцию, но у меня проблема с окном данных, так как я использую фильтр для изменения данных в окне данных.

вот мой код:

of_addnode(treeviewitem node, rootrow):

int li_rows,li_newitem, i
treeviewitem li_tvitem

dw_1.SetFilter("pid = " + string(node.data))
dw_1.Filter( )

li_rows =  dw_1.RowCount()

if li_rows = 0 then
    return
end if

for i = 1 to li_rows
    li_tvitem.level = node.level +1
    li_tvitem.data = dw_1.GetItemNumber(i,"id") 
    li_tvitem.label = dw_1.GetItemString(i,"description") 
    li_tvitem.pictureindex = 1 
    li_tvitem.selectedpictureindex = 2
    li_newitem = tv_1.insertitemsort (rootrow, li_tvitem)  // insert a new node 
    of_addnode(li_tvitem,li_newitem)

    dw_1.SetFilter("pid = " + string(node.data))  //restore data back to filter, problem here. tree will have duplicate item
        dw_1.Filter( )
next

Как создать рекурсивную функцию из одного окна данных источника данных для этого случая?

1 ответ

Вот некоторые идеи... звучит так, как будто вы хотите использовать элемент управления treeview, и я не виню вас, поскольку объект данных treeview не очень улучшен, потому что он показывает кнопку расширения, даже если нет дочерних элементов, и у меня нет ' Я нашел элегантный способ справиться с этим.

Одна вещь, чтобы рассмотреть, поможет ли вам манипулирование данными на сервере? Это работает для использования типа объекта данных в виде дерева или может помочь сделать логику рекурсии более простой.

Это представление базы данных в MySQL, но может быть разработано для других баз данных. Я обрезал его на трех уровнях рекурсии, и да, он был жестко запрограммирован для шести уровней рекурсии, максимально поддерживаемых этим приложением. Это прекрасно работает при использовании элемента управления dataview объекта дерева, но вы застряли с проблемами кнопки расширения, когда нет дочерних элементов. Это также может быть полезно для упрощения логики рекурсии, эффективно давая вам "путь" к элементу.

** БАЗА ДАННЫХ ДЛЯ СВЯЗАННЫХ ОТНОШЕНИЙ РОДИТЕЛЯ И РЕБЕНКА (ИЕРАРХИЯ) **

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `root`@`%` 
    SQL SECURITY DEFINER
VIEW `v_category` AS
    select 
        `t1`.`parent_id` AS `parent1`,
        `t1`.`id` AS `id1`,
        `t1`.`title` AS `title1`,
        `t1`.`sort_order` AS `sort1`,
        `t2`.`parent_id` AS `parent2`,
        `t2`.`id` AS `id2`,
        `t2`.`title` AS `title2`,
        `t2`.`sort_order` AS `sort2`,
        `t3`.`parent_id` AS `parent3`,
        `t3`.`id` AS `id3`,
        `t3`.`title` AS `title3`,
        `t3`.`sort_order` AS `sort3`
from
    (((((`ld_category` `t1`
    left join `ld_category` `t2` ON ((`t2`.`parent_id` = `t1`.`id`)))
    left join `ld_category` `t3` ON ((`t3`.`parent_id` = `t2`.`id`)))
    left join `ld_category` `t4` ON ((`t4`.`parent_id` = `t3`.`id`)))

СТРОИТЕЛЬНОЕ ТРИВИЮ С ИСПОЛЬЗОВАНИЕМ РЕКУРСИИ

Вы на правильном пути для заполнения древовидного элемента управления, но не видя ваш объект данных, невозможно узнать, правильно ли работают ваш setfilter и filter и что происходит. Ключ должен получить уровень из функции insertitemXXX и передать его в первый аргумент следующей функции insertitemXXX. Этот простой пример помощи PB всегда выводит меня на правильный путь. Я вижу, вы используете древовидные элементы, но это ничего не меняет. Надеюсь это поможет.

long ll_lev1, ll_lev2, ll_lev3, ll_lev4
int  index

ll_lev1 = tv_list.InsertItemLast(0,"Composers",1)
ll_lev2 = tv_list.InsertItemLast(ll_lev1, "Beethoven",2)
ll_lev3 = tv_list.InsertItemLast(ll_lev2, "Symphonies",3)
FOR index = 1 to 9
    ll_lev4 = tv_list.InsertItemSort(ll_lev3, "Symphony # " + String(index), 4)
NEXT
Другие вопросы по тегам