Как написать рекурсивную функцию для создания древовидного представления данных в окне данных?
У меня есть данные родитель-потомок в окне данных из таблицы 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