Office中国论坛/Access中国论坛

标题: 请教一个树节点展开问题。 [打印本页]

作者: fnsmydyang    时间: 2012-6-29 14:47
标题: 请教一个树节点展开问题。
最近碰到一个小问题,一直还未找到解决问题最佳方法,请大侠指点。
当树节点多时,怎样才能做到只展开当前节点,其它节点不展开,多多指教,是否要用到递归算法?

作者: Henry D. Sy    时间: 2012-6-29 14:57
应该本来就是这样的,你能传例子吗
作者: Henry D. Sy    时间: 2012-6-29 15:06
TreeView1.Nodes(索引).Expanded = True
作者: roych    时间: 2012-6-29 15:34
附上红尘的一个实例供参考:[attach]49534[/attach]
作者: fnsmydyang    时间: 2012-6-29 15:45
谢谢热心的版主,我的意思是只展开当前目录下的节点,其它节点都收起来。
[attach]49535[/attach]
[attach]49536[/attach]


作者: Henry D. Sy    时间: 2012-6-29 16:27
你的例子就是你所要求的呀
作者: Henry D. Sy    时间: 2012-6-29 16:48
本帖最后由 Henry D. Sy 于 2012-6-29 16:49 编辑

呵呵,原来你是想展开这个关闭哪个!!
  1. Private Sub xTree_NodeClick(ByVal Node As Object)
  2.     On Error Resume Next
  3.     Dim tree0 As TreeView
  4.     Set tree0 = Me.xTree.Object
  5.     'tree0.SelectedItem.Parent.Text

  6.     lngKM = Nz(Right(Node.Key, Len(Node.Key) - 1))
  7.     Dim I As Integer
  8.     For I = 1 To tree0.Nodes.Count
  9.         tree0.Nodes(I).Expanded = False
  10.     Next I
  11.     tree0.Nodes(Node.Index).Expanded = True
  12.    
  13. End Sub
复制代码
[attach]49538[/attach]
作者: fnsmydyang    时间: 2012-6-29 20:07
版主,这个方法我已用过了,行不通,有问题,要不您再试试。如果当前节点有父节点,如果父节点未展开,收缩了,当前节点怎么展的开呢?
作者: Henry D. Sy    时间: 2012-6-29 20:14
fnsmydyang 发表于 2012-6-29 20:07
版主,这个方法我已用过了,行不通,有问题,要不您再试试。如果当前节点有父节点,如果父节点未展开,收缩 ...

说得是呀
作者: 咱家是猫    时间: 2012-6-29 20:33
Private Sub xTree_NodeClick(ByVal Node As Object)

    On Error Resume Next
   
    Dim I As Integer
    Dim tree0 As TreeView
    Set tree0 = Me.xTree.Object
    If inttreeIndex <> 0 Then
        Me.xTree.Nodes(inttreeIndex).Expanded = False
    End If
    inttreeIndex = Node.Index
    lngKM = Nz(Right(Node.Key, Len(Node.Key) - 1))
   
    For I = 1 To tree0.Nodes.Count
        tree0.Nodes(I).Expanded = False
    Next I
    tree0.Nodes(Node.Index).Selected = True         
End Sub

作者: fnsmydyang    时间: 2012-6-29 21:11
谢谢版主,问题解决了,正是如此,只是节点有点闪。
作者: 咱家是猫    时间: 2012-6-30 08:18
闪是因为每次都循环收起了一遍造成的.理论上这是在浪费资源.可以试着用变量记录上次的节点,点击下一个节点时判断一下.那就是最合理的了.
作者: 咱家是猫    时间: 2012-6-30 09:04

Private Sub xTree_NodeClick(ByVal Node As Object)

    On Error Resume Next
   
    Dim tree0 As TreeView
    Static intLastNode As Integer
   
    Set tree0 = Me.xTree.Object

    If intLastNode <> 0 Then
        Debug.Print GetParentIndex(Node), intLastNode
        If GetParentIndex(Node) <> intLastNode Then
            Me.xTree.Nodes(intLastNode).Expanded = False
        End If
    End If
   
    intLastNode = Node.Index
    Node.Seleted = True
    Node.Expanded = True
   
    lngKM = Nz(Right(Node.Key, Len(Node.Key) - 1))
   
End Sub

Function GetParentIndex(Node As Object) As Integer

    On Error Resume Next
   
    If Node.Index = 1 Then Exit Function
    GetParentIndex = Node.Parent.Index
   
End Function

'PS:点击节点前的伸展符号不在此代码考虑之列.
作者: fnsmydyang    时间: 2012-6-30 09:21
本帖最后由 fnsmydyang 于 2012-6-30 09:23 编辑

版主,先行谢谢了,经调试还是行不通呢!是我使用不正确?讨教了,要不麻烦在实例上修改一下试试。{:soso_e181:}
[attach]49539[/attach]
作者: fnsmydyang    时间: 2012-6-30 09:46
咱家是猫 发表于 2012-6-29 20:33
Private Sub xTree_NodeClick(ByVal Node As Object)

    On Error Resume Next

版主,其实我的想法很简单,判定当前节点是否有父节点,如果有需判断有多少个Parent节点,这些Parent都展开,其它都收缩,您看这样行得通吗?
作者: 咱家是猫    时间: 2012-6-30 09:53
上面那段代码其实就是这个意思,当单击一个节点时,判断上一个单击过的节点,如果不存在,就作罢.如果存在,接着获取本次点击的节点的父节点,与上次节点比对,如果是一样的,作罢,如果不一样,则收起上个节点.
接下来是常规动作,展开本节点,把本节点Index给变量(intLastIndex),以便下次判断.
作者: fnsmydyang    时间: 2012-6-30 10:04
咱家是猫 发表于 2012-6-30 09:53
上面那段代码其实就是这个意思,当单击一个节点时,判断上一个单击过的节点,如果不存在,就作罢.如果存在,接着 ...

那现在代码复制在程序中没有达到预期效果,不知为什么?我有传附件上来,帮忙再看一下,谢谢了!!!
作者: 咱家是猫    时间: 2012-6-30 10:14
重新写了一下,上面那个忽略了关闭多级节点.看例子
[attach]49542[/attach]
作者: fnsmydyang    时间: 2012-6-30 10:28
咱家是猫 发表于 2012-6-30 10:14
重新写了一下,上面那个忽略了关闭多级节点.看例子

版主,还是不行,我试过了,当单击同层第二个节点时,父节点会收缩,其它节点没有反映,还得再修改,谢谢!!!
作者: 咱家是猫    时间: 2012-6-30 10:38
是噢,这个又忽略了,唉...这要考虑的东西还真多

作者: fnsmydyang    时间: 2012-6-30 10:42
咱家是猫 发表于 2012-6-30 10:38
是噢,这个又忽略了,唉...这要考虑的东西还真多

嘻...,辛苦版主了。
作者: 咱家是猫    时间: 2012-6-30 11:07
用了一个最方便,但不严谨的做法.这种做法要求你的所有节点的Text都不能有相同的.

Private Sub xTree_NodeClick(ByVal Node As Object)

    On Error Resume Next
   
    Dim tree0 As TreeView
    Dim strPath As String
   
    Static intLastNode As Integer
   
    Set tree0 = Me.xTree.Object

    strPath = "\" & Node.FullPath & "\"
    If intLastNode <> 0 Then
        For i = 1 To tree0.Nodes.Count
            If tree0.Nodes(i).Expanded = True Then
                If InStr(strPath, "\" & tree0.Nodes(i).Text & "\") = 0 Then
                    tree0.Nodes(i).Expanded = False
                End If
            End If
        Next i
    End If
   
    intLastNode = Node.Index
    Node.Seleted = True
    Node.Expanded = True
   
    lngKM = Nz(Right(Node.Key, Len(Node.Key) - 1))
   
End Sub

作者: 咱家是猫    时间: 2012-6-30 11:08
本帖最后由 咱家是猫 于 2012-6-30 11:08 编辑

这个方法还是回到了老路上--循环,但此循环在执行时,进行了更多的比对,解决了闪的问题.
作者: fnsmydyang    时间: 2012-6-30 14:23
咱家是猫 发表于 2012-6-30 11:08
这个方法还是回到了老路上--循环,但此循环在执行时,进行了更多的比对,解决了闪的问题.

版主,我是用数组存储Indext 值,但是闪的问题不能解决,请帮忙,谢谢!!!
Private Sub xTree_NodeClick(ByVal Node As Object)
On Error Resume Next
    Dim NodeP As Node
    Dim N As Integer
    Dim I As Integer
    Dim IntParentIndext() As Integer
    Set NodeP = Node
    For N = 0 To 100
        If Not (NodeP.Parent Is Nothing) Then
            Set NodeP = NodeP.Parent
            'MsgBox NodeP.Index
            IntParentIndext(N) = NodeP.Index
        Else
            Exit For
        End If
    Next
    For I = 0 To UBound(IntParentIndext())
        For J = 1 To Me.xTree.Nodes.Count
            If IntParentIndext(I) <> Me.xTree.Nodes(J).indext Then
               Me.xTree.Nodes(J).Expanded = False
            Else
            End If
        Next J
    Next I
    Me.xTree.Nodes(Node.Index).Selected = True
End Sub

作者: 咱家是猫    时间: 2012-6-30 21:10
22楼的方法不行吗?
作者: fnsmydyang    时间: 2012-6-30 22:05
咱家是猫 发表于 2012-6-30 21:10
22楼的方法不行吗?

行的通,谢谢,只是想用不同的方法试一下。
作者: 鱼儿游游    时间: 2012-7-1 09:49
本帖最后由 鱼儿游游 于 2012-7-1 10:26 编辑
咱家是猫 发表于 2012-6-30 11:07
用了一个最方便,但不严谨的做法.这种做法要求你的所有节点的Text都不能有相同的.

Private Sub xTree_Nod ...


下面的方法完美解决了:要求你的所有节点的Text都不能有相同的。

  1. '=================================================================
  2. '功能:只展开树当前节点,其它节点不展开
  3. '
  4. '调用: GetTreeAllParentNode_Key
  5. '
  6. '作者:鱼儿游游  QQ:7178000
  7. '
  8. '时间:2012-06-30
  9. '=================================================================
  10. Private Sub xTree_NodeClick(ByVal Node As Object)
  11. On Error GoTo Err_Handler
  12.     Dim tvwTree    As Object
  13.     Dim dicNodeKey As Object
  14.     Dim strNodeKey As String
  15.     Dim intI As Integer
  16.     Set tvwTree = Me.xTree.Object
  17.     With tvwTree
  18.         If GetTreeAllParentNode_Key(Node, dicNodeKey) Then
  19.             For intI = 1 To .Nodes.Count
  20.                strNodeKey = .Nodes(intI).Key
  21.                If Not dicNodeKey.Exists(strNodeKey) Then .Nodes(intI).Expanded = False
  22.             Next
  23.         End If
  24.         .Nodes(Node.Index).Selected = True
  25.     End With
  26. Exit_Handler:
  27.     Set tvwTree = Nothing
  28.     Set dicNodeKey = Nothing
  29.     Exit Sub
  30. Err_Handler:
  31.     Resume Exit_Handler
  32. End Sub

  33. '=================================================================
  34. '-函数名称: GetTreeAllParentNode_Key
  35. '-功能描述: 返回指定树节点的所有父节点的KEY
  36. '-输入参数: NodeX ......... 树中的任一节点
  37. '           dicNodeKey .... 返回值
  38. '-返回参数: 1、dicNodeKey 的内容,就是指定树节点的所有父节点的KEY
  39. '           2、程序不出错返回:True,否则返回:False
  40. '-作    者: 鱼儿游游  QQ:7178000
  41. '-创建日期; 2012-06-30
  42. '=================================================================
  43. Private Function GetTreeAllParentNode_Key(ByVal NodeX As Node, ByRef dicNodeKey As Object) As Boolean
  44. On Error GoTo Err_Handler
  45.     Dim blnResult  As Boolean
  46.     Dim nodCurrent As Node
  47.     blnResult = False
  48.     Set nodCurrent = NodeX
  49.     Set dicNodeKey = CreateObject("Scripting.Dictionary")
  50.     If Not dicNodeKey Is Nothing Then dicNodeKey.RemoveAll
  51.     Do Until nodCurrent.Parent Is Nothing
  52.        Set nodCurrent = nodCurrent.Parent
  53.        dicNodeKey(nodCurrent.Key) = ""
  54.     Loop
  55.     blnResult = True
  56. Exit_Handler:
  57.     GetTreeAllParentNode_Key = blnResult
  58.     Set nodCurrent = Nothing
  59.     Exit Function
  60. Err_Handler:
  61.     blnResult = False
  62.     MsgBox Err.Description, vbCritical, "返回选择节点的所有父点的KEY的集合函数"
  63.     Resume Exit_Handler
  64. End Function
复制代码
[attach]49549[/attach]
作者: 轻风    时间: 2012-7-3 10:59
树控件不是有个 单项选择(SingleSel) 的属性吗?选上它好象就行了吧?
作者: fnsmydyang    时间: 2012-7-3 16:01
鱼儿游游 发表于 2012-7-1 09:49
下面的方法完美解决了:要求你的所有节点的Text都不能有相同的。

几天没上论坛,有这么多的人帮我解决问题,非常感谢,真是学海无涯,山外有山了。
作者: fnsmydyang    时间: 2012-7-3 16:02
轻风 发表于 2012-7-3 10:59
树控件不是有个 单项选择(SingleSel) 的属性吗?选上它好象就行了吧?

谢谢了,我试试。
作者: 鱼儿游游    时间: 2012-7-4 00:31
效果如何?
作者: fnsmydyang    时间: 2012-7-5 08:26
{:soso__4381034265018196355_1:}谢谢!!!,效果不错,向兄台学习,以后请多指教。
作者: 轻风    时间: 2012-7-5 08:43
[attach]49573[/attach]
[attach]49574[/attach]
作者: fnsmydyang    时间: 2012-7-5 10:16
轻风 发表于 2012-7-5 08:43

[attach]49576[/attach]按版主属性设置我试了一下,还存在一点小问题,上传一实例附件.
作者: 轻风    时间: 2012-7-5 10:36
啥问题?
作者: jinzhanxi    时间: 2012-7-5 10:37
貌似点击时提示错误
作者: 轻风    时间: 2012-7-5 10:58
错误是因为这一句:MsgBox Me.TreeView.selectitem.Parent.Text

作者: jinzhanxi    时间: 2012-7-6 08:41
轻风 发表于 2012-7-5 10:58
错误是因为这一句:MsgBox Me.TreeView.selectitem.Parent.Text

如何修改?能改完了上传下吗?学习学习
作者: jinzhanxi    时间: 2012-7-6 09:45
明白了……




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3