如何编写递归函数来从datawindow中的数据创建树视图?

时间:2014-08-22 18:23:37

标签: sybase powerbuilder powerbuilder-pfc

我在表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 个答案:

答案 0 :(得分:0)

这里有一些想法...听起来你想要使用treeview控件而且我不怪你因为treeview数据对象不是很精致,因为它显示了扩展按钮,即使没有任何子节点我还没有找到一种优雅的方式来解决这个问题。

要考虑的一件事是,操纵后端数据会对你有所帮助吗?这适用于使用treeview dataobject类型,或者可能有助于使递归逻辑更简单。

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

**数据库查看平面父母和儿童(HIERARCHY)关系**

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`)))

使用回归构建TREEVIEW

您在填充树视图控件的正确轨道上但没有看到您的数据对象,则无法知道您的setfilter和过滤器是否正常工作以及发生了什么。关键是从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