我希望能够创建一个树视图,使其节点可以形成计算机上的目录。在下面的代码中,我能够将所有文件放入列表中,但是我无法正确获取文件夹。我的意思是在您的用户目录中,您有子文档,如文档,音乐和图片。运行此代码时,它会将每个代码显示为自己的节点,而不是嵌套。我希望这是有道理的。谢谢在VB.NET中。
Private Sub PopulateTree(ByVal path As String, ByVal subfoldercount As Integer)
Dim items() As String
items = Directory.GetFileSystemEntries(path)
Dim itm As String
TreeVeiw1.Nodes.Add(path)
Dim currentnode As TreeNode = TreeView1.Nodes.Item(0)
For Each itm In items
If Directory.Exists(itm) Then
Dim nodeOjb As New TreeNode
nodeOjb.Text = "FOLDER :: " & subfoldercount & " :: " & itm
nodeOjb.ForeColor = Color.Blue
currentnode.Nodes.Add(nodeOjb)
PopulateTree(itm, subfoldercount + 1)
Else
Dim nodeOjb As New TreeNode
nodeOjb.Text = "FILE :: " & subfoldercount & " :: " & itm
Select Case My.Computer.FileSystem.GetFileInfo(itm).Extension
Case ".txt"
nodeOjb.ForeColor = Color.Orange
currentnode.Add(nodeOjb)
Case ".png"
nodeOjb.ForeColor = Color.Red
currentnode.Add(nodeOjb)
Case ".ico"
nodeOjb.ForeColor = Color.Green
currentnode.Add(nodeOjb)
Case ".url"
nodeOjb.ForeColor = Color.Black
currentnode.Add(nodeOjb)
End Select
End If
Next
End Sub
将代码更改为spinion告诉我的方式。当我运行此代码时,当它开始尝试将文件添加到树视图时,我收到错误“对象引用未设置为对象的实例”。
答案 0 :(得分:2)
只需快速浏览一下,您就可以将找到的每个节点添加到树的根级别。
TreeView1.Nodes.Add(nodeOjb)
您应该做的是通过递归调用您正在处理的当前节点,并使用它来添加找到的下一级节点。
currentNode.Add(nodeObj)
这样您就可以将子节点添加到节点中。而不是总是将所有节点添加到树的根目录。
编辑:以下是您需要对PopulateTree方法进行的更改:
Private Sub PopulateTree(currentNode As TreeNode, path__1 As String, subfoldercount As Integer)
Dim items As String() = Nothing
items = Directory.GetFileSystemEntries(path__1)
Dim nodeParent As TreeNodeCollection = If((currentNode IsNot Nothing), currentNode.Nodes, Me.TreeView1.Nodes)
For Each itm As String In items
If Directory.Exists(itm) Then
Dim nodeOjb = New TreeNode()
nodeOjb.Text = "FOLDER :: " & subfoldercount & " :: " & itm
nodeOjb.ForeColor = Color.Blue
nodeParent.Add(nodeOjb)
Me.PopulateTree(nodeOjb, itm, subfoldercount + 1)
Else
Dim nodeOjb = New TreeNode()
nodeOjb.Text = "FILE :: " & subfoldercount & " :: " & itm
Select Case Path.GetExtension(itm)
Case ".txt"
nodeOjb.ForeColor = Color.Orange
nodeParent.Add(nodeOjb)
Exit Select
Case ".png"
nodeOjb.ForeColor = Color.Red
nodeParent.Add(nodeOjb)
Exit Select
Case ".ico"
nodeOjb.ForeColor = Color.Green
nodeParent.Add(nodeOjb)
Exit Select
Case ".url"
nodeOjb.ForeColor = Color.Black
nodeParent.Add(nodeOjb)
Exit Select
End Select
End If
Next
End Sub
然后当你第一次打电话时,你会这样做:
PopulateTree(Nothing, "", 0)
您为第一个调用传递一个空引用,以便它使用父代。第二个参数是你的路径。
P.S。我主要是一个C#家伙所以我使用转换器来改变代码。它应该工作,但你可能需要调整一点。