2014-09-12 145 views
0

我有一个DataTable,可以有1到14列,我想。我希望创建一个TreeView,以便可以更好地对所呈现的数据进行排序。问题是,当我通过数据表循环时,它没有正确格式树。实际上,它只获取根节点和子节点,但它多次添加子节点。现在我可以蛮横地逼它工作,但这是低效的。所以如果有人能帮助我。将子节点添加到VB中的TreeView上的Childe节点

A data table that is used What it should look like in the tree

代码:(忽略.Count - 5

Public Sub loadTreeView() 

    compClass.treeView.Nodes.Clear() 

    Dim row As DataRow 
    Dim parentNode As TreeNode 
    Dim childNode As TreeNode 

    Dim count As Integer = compClass.dataTable.Columns.Count - 5 

    Dim test(count) As TreeNode 

    For Each row In compClass.dataTable.Rows 

     For i As Integer = 0 To count 

      If i = 0 Then 
       test(i) = searchNode(row.Item(i).ToString()) 
       If test(i) IsNot Nothing Then 
       Else 
        test(i) = New TreeNode(row.Item(i).ToString()) 
        compClass.treeView.Nodes.Add(test(i)) 
       End If 
       'parentNode = searchNode(row.Item(0).ToString()) 
       'If parentNode IsNot Nothing Then 
       'Else 
       ' parentNode = New TreeNode(row.Item(0).ToString()) 
       ' compClass.treeView.Nodes.Add(parentNode) 
       'End If 
      Else 
       childNode = searchNode(row.Item(i - 1).ToString()) 
       If childNode IsNot Nothing Then 
        test(i) = New TreeNode(row.Item(i).ToString()) 
        test(i - 1).Nodes.Add(test(i)) 
       End If 
       'parentNode = searchNode(row.Item(i - 1).ToString()) 
       'If parentNode IsNot Nothing Then 
       ' childNode = New TreeNode(row.Item(i).ToString()) 
       ' parentNode.Nodes.Add(childNode) 
       'End If 
      End If 
     Next 
    Next 
End Sub 

Private Function searchNode(ByVal nodeText As String) 
    For Each node As TreeNode In compClass.treeView.Nodes 
     If node.Text = nodeText Then 
      Return node 
     End If 
    Next 

End Function 
+0

它假设看起来像表布局下的图像。 – CodeMonkey 2014-09-15 14:27:45

回答

2

我想,如果你想在你想要的父母第一 例如添加“树添加子来告诉你9“到”2014“ 您将”2014“设置为父节点,然后添加”9“

并且如果要在树视图中搜索节点,请使用Nodes.Find键),搜索节点的搜索方法仅搜索根节点。

终于在添加节点时使用密钥,它知道父节点和当前节点是否重复的方式。

例如: 2014 - > 9 - > AL
“9”还有关键的是“20149” 当添加Al元素检查“20149”是存在的,如果是的父节点,然后检查键“20149AL “如果不存在则添加节点‘AL’......等

试试这个代码,它的工作,我:)

Public Sub loadTreeView() 
    compClass.treeView.Nodes.Clear() 
    Dim parentNode As TreeNode 
    Dim childNode As TreeNode 
    Dim count As Integer = compClass.dataTable.Columns.Count - 1 
    Dim row As DataRow 
    Dim ItemKey As String 

    For Each row In compClass.dataTable.Rows 
     Dim test(count) As TreeNode 
     ItemKey = Nothing 
     For i As Integer = 0 To count 
      If i = 0 Then 
       test(i) = searchNode(row.Item(i).ToString()) 
       If test(i) IsNot Nothing Then 
       Else 
        test(i) = New TreeNode(row.Item(i).ToString()) 
        compClass.treeView.Nodes.Add(row.Item(i).ToString(), row.Item(i).ToString()) 'Add item and key for item 
       End If 
       ItemKey = row.Item(i).ToString() 
      Else 
       parentNode = searchNode(ItemKey) 
       childNode = searchNode(ItemKey & row.Item(i).ToString()) 

       If childNode IsNot Nothing Then 
        ItemKey &= row.Item(i).ToString() 
       ElseIf parentNode IsNot Nothing Then 
        test(i) = New TreeNode(row.Item(i).ToString()) 
        parentNode.Nodes.Add(ItemKey & row.Item(i).ToString(), row.Item(i).ToString()) 
        ItemKey &= row.Item(i).ToString() 
       End If 
      End If 
     Next 
    Next 
End Sub 

Private Function searchNode(ByVal nodeKey As String) As TreeNode 
    Dim FoundNodes As TreeNode() = compClass.treeView.Nodes.Find(nodeKey, True) 
    If FoundNodes IsNot Nothing AndAlso FoundNodes.Length > 0 Then 
     Return FoundNodes(0) 
    End If 
    Return Nothing 
End Function 
+0

我可以试试这个。它看起来很稳固。我会尽快通知你。 – CodeMonkey 2014-09-15 14:29:42

+0

这工作完美!非常感谢你! – CodeMonkey 2014-09-15 18:56:11

+0

您的欢迎;) – Jala 2014-09-15 18:59:29