none
詢問TreeView 相鄰 Node 合併問題 RRS feed

  • 問題

  • 想請問如果要將TreeView的相鄰Node做整理
    我的Node如下 裡面有N個子節點,但我每次都把相鄰的兩個Node拿來做判斷
    可以麻煩指導應該要怎麼下手嗎

      Dim firstNode As TreeNode
      Dim secndNode As TreeNode
    

    (原始)
    A
    |-B
    | |-B1
    |-C
    A-B
    | |-B2
    |-D


    想要在node檢查後變成下面這樣,想請問有沒有什麼辦法..
    因為我只有相臨的NODE才要做整理!!

    (比較後)
    A-B
    | |-B1
    | |-B2
    |-C
    |-D


    >"< 實在找不到相關的處理辦法,所以來這問一下~
    希望可以指導我
    已經卡點好幾天了 再次感謝

    2010年2月4日 上午 07:36

解答

  • Hi,

    要相鄰的節點可參考
    NextNode Gets the next sibling tree node.
    PrevNode Gets the previous sibling tree node.

    另外用Nodes巡覽時,Nodes下的TreeNode彼此都是兄弟。
    舉例來說root.Nodes下應該會有兩個A節點

    這邊試寫了一個範例,參考看看吧
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim allNodes() As TreeNode = GetAllTreeNodes(TreeView1)
            Dim node1, node2 As TreeNode
            For idx1 As Integer = allNodes.Count - 1 To 0 Step -1
                For idx2 As Integer = idx1 - 1 To 0 Step -1
                    node1 = allNodes(idx1)
                    node2 = allNodes(idx2)
                    If node1.TreeView IsNot Nothing AndAlso node2.TreeView IsNot Nothing AndAlso node1.FullPath = node2.FullPath Then
                        For Each n As TreeNode In node1.Nodes
                            n.Remove()
                            node2.Nodes.Add(n)
                        Next
                        node1.Remove()
                    End If
                Next
            Next
        End Sub
    
        Private Function GetAllTreeNodes(ByVal treeOrNode As Object) As TreeNode()
            Dim nodes As New List(Of TreeNode)
            If TypeOf treeOrNode Is TreeNode Then
                nodes.Add(treeOrNode)
                For Each tn As TreeNode In treeOrNode.Nodes
                    nodes.AddRange(GetAllTreeNodes(tn))
                Next
            ElseIf TypeOf treeOrNode Is TreeView Then
                For Each tn As TreeNode In treeOrNode.Nodes
                    nodes.AddRange(GetAllTreeNodes(tn))
                Next
            Else
                Throw New ArgumentException("Error param type!!")
            End If
            Return nodes.ToArray
        End Function
    End Class
    


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 Lolota Lee 2010年2月10日 上午 06:04
    2010年2月4日 上午 11:59
  • 建議將原始資料排序之後再填入TreeView, 就可以達到所要的效果了
    • 已標示為解答 Lolota Lee 2010年2月10日 上午 06:04
    2010年2月5日 上午 03:39

所有回覆

  • 相鄰的Node的定義是什麼 ?  你的圖上的  "A"節點和"A-B"節點有什麼關係存在 ?

    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    2010年2月4日 上午 09:39
    版主
  • Hi,

    要相鄰的節點可參考
    NextNode Gets the next sibling tree node.
    PrevNode Gets the previous sibling tree node.

    另外用Nodes巡覽時,Nodes下的TreeNode彼此都是兄弟。
    舉例來說root.Nodes下應該會有兩個A節點

    這邊試寫了一個範例,參考看看吧
    Public Class Form1
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim allNodes() As TreeNode = GetAllTreeNodes(TreeView1)
            Dim node1, node2 As TreeNode
            For idx1 As Integer = allNodes.Count - 1 To 0 Step -1
                For idx2 As Integer = idx1 - 1 To 0 Step -1
                    node1 = allNodes(idx1)
                    node2 = allNodes(idx2)
                    If node1.TreeView IsNot Nothing AndAlso node2.TreeView IsNot Nothing AndAlso node1.FullPath = node2.FullPath Then
                        For Each n As TreeNode In node1.Nodes
                            n.Remove()
                            node2.Nodes.Add(n)
                        Next
                        node1.Remove()
                    End If
                Next
            Next
        End Sub
    
        Private Function GetAllTreeNodes(ByVal treeOrNode As Object) As TreeNode()
            Dim nodes As New List(Of TreeNode)
            If TypeOf treeOrNode Is TreeNode Then
                nodes.Add(treeOrNode)
                For Each tn As TreeNode In treeOrNode.Nodes
                    nodes.AddRange(GetAllTreeNodes(tn))
                Next
            ElseIf TypeOf treeOrNode Is TreeView Then
                For Each tn As TreeNode In treeOrNode.Nodes
                    nodes.AddRange(GetAllTreeNodes(tn))
                Next
            Else
                Throw New ArgumentException("Error param type!!")
            End If
            Return nodes.ToArray
        End Function
    End Class
    


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 Lolota Lee 2010年2月10日 上午 06:04
    2010年2月4日 上午 11:59
  • 建議將原始資料排序之後再填入TreeView, 就可以達到所要的效果了
    • 已標示為解答 Lolota Lee 2010年2月10日 上午 06:04
    2010年2月5日 上午 03:39