如何使用“n”填充树视图?数据表的层次结构级别? [英] How can I populate a treeview with "n" levels of hierarchy from a datatable?

查看:81
本文介绍了如何使用“n”填充树视图?数据表的层次结构级别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这段代码是硬编码的,可以将我的Tasks TreeView填充到三个级别。但是,我的任务列表在层次结构中可能有n级别,我想摆脱硬编码并提高灵活性。我的代码:



This block of code is hard-coded to populate my Tasks TreeView down to three levels. However, my list of Tasks could have "n" levels in the hierarchy and I want to get rid of the hard-coding and improve flexibility. My code:

TasksHierarchy.Nodes.Clear()
'populate treeview - add all top-level tasks
For Each dr As DataRow In DataSet1.DataTable1
   If dr.Item("ParentTaskID").Equals(DBNull.Value) Then 
   'task is at the top level
      TasksHierarchy.Nodes.Add("Task: " & dr.Item("TaskName") & "Task Type: " & dr.Item("TaskTypeName") & " - Owner: " & dr.Item("Name"))
   End If
Next
'add all second-level tasks
Dim child As Integer = 0
Dim grandchild As Integer = 0
For Each dr2 As DataRow In DataSet1.DataTable1
   For Each dr2Child As DataRow In BacklogView.DataSet1.DataTable1.Select("ParentTaskID='" & dr2.Item("JobTaskID") & "'")
      If child < TasksHierarchy.Nodes.Count - 1 Then
         TasksHierarchy.Nodes(child).Nodes.Add("Task: " & dr2Child.Item("TaskName") & " - Task Type: " & dr2Child.Item("TaskTypeName") & " - Owner: " & dr2Child.Item("Name"))
      End If
      'add all third-level tasks
      For Each dr2GrandChild As DataRow In DataSet1.DataTable1.Select("ParentTaskID='" & dr2Child.Item("JobTaskID") & "'")
                        TasksHierarchy.Nodes(child).Nodes(grandchild).Nodes.Add("Task: " & dr2GrandChild.Item("TaskName") & " - Task Type: " & dr2GrandChild.Item("TaskTypeName") & " - Owner: " & dr2GrandChild.Item("Name"))
      Next
      grandchild = grandchild + 1
   Next
   child = child + 1
Next





我尝试了什么:



我尝试制作分层DataGridView来显示依赖关系但是从在线示例的C#转换为VB.Net不起作用,程序崩溃。



What I have tried:

I have tried making a hierarchical DataGridView to show the dependencies but converting from the online example's C# to VB.Net did not work and the program crashed.

推荐答案

遍历任意深层次的数据结构。

嗯....

这看起来像是一份工作: 递归



顶级处理基本相同,只是在 Add() sa节点之后,它调用一个递归函数来处理直接的孩子。在该函数中,当一个节点 Add() ed时,再次调用相同的函数来处理子项等。

(这是Depth-first tree traversal。)



==========

这样的东西(我不是一个复杂的VB开发者.C#是的。):

Traversing an arbitrarily deep hierarchical data structure.
Hmmmm....
This looks like a job for: Recursion

The top level processing is essentially the same, except that after it Add()s a node, it calls a recursive function that deals with the direct children. In that function, when a node is Add()ed, the same function is called again to process its children, etc.
(This is a "Depth-first tree traversal".)

==========
Something like this (I'm not a sophisticated VB dev. C# yes.):
' At the appropriate place in the code...
Private Sub AddDescendents(ByVal nodes As TreeNodeCollection, ByVal data As DataTable, ByVal taskID as String)
  For Each dr As DataRow in data.Select("ParentTaskID='" & taskID & "'")
    Dim newNode As TreeNode
    newNode = nodes.Add("Task: " & dr.Item("TaskName") & _
                        " - Task Type: " & dr.Item("TaskTypeName") & _
                        " - Owner: " & dr.Item("Name"))
    AddDescendents(newNode.Nodes, data, dr.Item("JobTaskID"))
  Next
End Sub

' elsewhere ...
TasksHierarchy.BeginUpdate()
TasksHierarchy.Nodes.Clear()
Dim nodes As TreeNodeCollection = TasksHierarchy.Nodes
'populate treeview - add all top-level tasks
For Each dr As DataRow In DataSet1.DataTable1
  If IsDBNull(dr.Item("ParentTaskID")) Then 
    'task is at the top level
    Dim newNode As TreeNode
    newNode = nodes.Add("Task: " & dr.Item("TaskName") & _
                        " - Task Type: " & dr.Item("TaskTypeName") & _
                        " - Owner: " & dr.Item("Name"))
    AddDescendents(newNode.Nodes, DataSet1.DataTable1, dr.Item("JobTaskID"))
  End If
Next
TasksHierarchy.EndUpdate()





(如果我更了解VB,可以合并一些复制......)



(Some of the duplication could be consolidated if I knew VB better...)


这篇关于如何使用“n”填充树视图?数据表的层次结构级别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆