创建一个类似Visual Studio的解决方案资源管理器
问题描述:
我希望能够创建一个树形视图,使其节点可以形成计算机上的目录。在下面的代码中,我能够将所有文件都放入列表中,但我无法获得正确的文件夹。我的意思是在你的用户目录中,你有副导演,如文件,音乐和图片。当你运行这个代码时,它将它们分别显示为它们自己的节点,而不是嵌套的。我希望这是有道理的。感谢在VB.NET请。创建一个类似Visual Studio的解决方案资源管理器
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告诉我的方式。当我运行这段代码时,当它开始尝试将文件添加到树视图时,出现错误“未将对象引用设置为对象的实例”。
答
只是快速浏览一下,你似乎将你找到的每个节点添加到树的根级。
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#人,所以我使用转换器来更改代码。它应该可以工作,但你可能需要稍微调整一下。
非常感谢。如果我是注册用户,我会为您投票。反正+1 – muckdog12 2010-07-16 23:08:11