标题:请教TreeView遍历选中节点及其子节点
只看楼主
hyf8285
Rank: 1
等 级:新手上路
帖 子:109
专家分:0
注 册:2013-1-21
得分:0 
回复 20楼 csyx
哈哈!是的,这个比喻好形象
2022-07-13 19:05
hyf8285
Rank: 1
等 级:新手上路
帖 子:109
专家分:0
注 册:2013-1-21
得分:0 
以下是引用csyx在2022-7-13 09:13:34的发言:

如果只是遍历子节点,几行代码就够了
1. 新建一个表单方法: 遍历子节点,代码如下
Lparameters oNode

? oNode.FullPath

Local oo

If oNode.Children > 0
    oo = oNode.Child
    Do while !IsNull(oo)
        This.遍历子节点(oo)
        oo = oo.Next
    EndDo
EndIf


2. 遍历子节点按钮.Click 调用它:
Thisform.遍历子节点(Thisform.treeView1.SelectedItem)

大佬!再请教:用你的递归遍历子节点,现在当我用这个查找子节点时,如果找到结果,则立即退出递归!请问:当满足条件时如何退出递归?谢谢!

Lparameters oNode,tcSelectKey
Local oCurNode,ChildKey,isIndetical
isIdentical = .F.
*ChildKey = oNode.Key
a = Alltrim(oNode.Key)
Messagebox(a+tcSelectKey,0,"")
If a == Alltrim(tcSelectKey)
    isIndetical = .T.
    Messagebox("相同了,找到啦!",0,"")
    Return                            &&这里应该退出了,并返回.T.,但是还是会继续下去,直至最后
Else
    isIndetical = .F.
Endif
If oNode.Children > 0
    oCurNode = oNode.Child
    Do While !Isnull(oCurNode)        
        This.findTreeNode(oCurNode,tcSelectKey)
        oCurNode = oCurNode.Next        
    Enddo
Endif
Return isIndetical

[此贴子已经被作者于2022-7-14 18:42编辑过]

2022-07-14 18:22
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
这样呢?
程序代码:
Lparameters oNode,tcSelectKey

Local oCurNode,ChildKey

a = Alltrim(oNode.Key)
Messagebox(a+tcSelectKey,0,"")

If a == Alltrim(tcSelectKey)
    Messagebox("相同了,找到啦!",0,"")
    Return .F.                            &&这里应该退出了,并返回.T.,但是还是会继续下去,直至最后
Endif

If oNode.Children > 0
    oCurNode = oNode.Child
    Do While !Isnull(oCurNode) and This.findTreeNode(oCurNode,tcSelectKey)
        oCurNode = oCurNode.Next     
    Enddo
Endif
2022-07-14 19:41
hyf8285
Rank: 1
等 级:新手上路
帖 子:109
专家分:0
注 册:2013-1-21
得分:0 
回复 23楼 csyx
好像不是立即退出的,还要再递归一次才退出,而且退出后都返回T

[此贴子已经被作者于2022-7-14 20:18编辑过]

2022-07-14 20:07
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
messagebox(a+tcSelectKey) 显示的是不是你需要的退出条件?

[此贴子已经被作者于2022-7-14 20:27编辑过]

2022-07-14 20:25
hyf8285
Rank: 1
等 级:新手上路
帖 子:109
专家分:0
注 册:2013-1-21
得分:0 
回复 25楼 csyx
那个是我看的输出结果,我条件是 a = tcSelectKey 现在解决了,我在外面加个变量,初始为.F.,然后找到后变为.T.,这样判断这个为.T.时就退出递归了,但是返回值都是.F.啊?
2022-07-14 20:38
hyf8285
Rank: 1
等 级:新手上路
帖 子:109
专家分:0
注 册:2013-1-21
得分:0 
程序代码:
Lparameters oNode,tcSelectKey
Local oCurNode,ChildKey,isIndetical
isIdentical = .F.
*ChildKey = oNode.Key
a = Alltrim(oNode.Key)
Messagebox(a+tcSelectKey,0,"")
If a == Alltrim(tcSelectKey)
    isIndetical = .T.    
    Messagebox("相同了,找到啦!",0,"")
    isCheck = .T.  &&加了这个
    Return isIndetical                        
Endif
If oNode.Children > 0
    oCurNode = oNode.Child
    Do While !Isnull(oCurNode) 
        If isCheck = .t.  &&判断
           Exit 
        Else 
        This.findTreeNode(oCurNode,tcSelectKey)            
        oCurNode = oCurNode.Next
        EndIf         
    Enddo
Endif
Return isIndetical


[此贴子已经被作者于2022-7-14 20:42编辑过]

2022-07-14 20:41
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
代码看上去怪怪的,逻辑不怎么对
2022-07-14 20:51
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
应该是调用 findTreeNode 的地方或者传入的 oNode 不对
2022-07-14 20:54
hyf8285
Rank: 1
等 级:新手上路
帖 子:109
专家分:0
注 册:2013-1-21
得分:0 
好的,我在研究研究,谢谢你!
2022-07-14 21:06



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-509547-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.110686 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved