我在表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
如何在这种情况下从一个数据源数据窗口创建递归函数?
答案 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