0

我在表 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

对于这种情况,如何从一个数据源数据窗口创建递归函数?

4

1 回答 1

0

这里有一些想法......听起来你想使用树视图控件,我不怪你,因为树视图数据对象不是很精致,因为即使没有任何孩子,它也会显示展开按钮,而我没有t 找到了一种优雅的方式来处理这个问题。

需要考虑的一件事是,在后端处理数据会对您有帮助吗?这适用于使用树视图数据对象类型,或者可能有助于使递归逻辑更简单。

此数据库视图位于 MySQL 中,但可以为其他数据库开发。我在三个递归级别上剪掉了它,是的,它被硬编码为六个级别的递归,这个应用程序支持的最大值。如果使用树视图数据对象控件,这很有效,但是当没有子项时,您会遇到展开按钮问题。通过有效地为您提供项目的“路径”,这对于简化递归逻辑也很有用。

**用于扁平化父母和孩子(层次结构)关系的数据库视图**

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 帮助示例总是让我走上正轨。我看到您正在使用 treeviewitems 但这并没有真正改变事情。希望这可以帮助。

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
于 2014-08-28T20:21:36.420 回答