创建一个像Visual Studio一样的解决方案浏览器

时间:2010-07-16 22:23:16

标签: vb.net treeview

我希望能够创建一个树视图,使其节点可以形成计算机上的目录。在下面的代码中,我能够将所有文件放入列表中,但是我无法正确获取文件夹。我的意思是在您的用户目录中,您有子文档,如文档,音乐和图片。运行此代码时,它会将每个代码显示为自己的节点,而不是嵌套。我希望这是有道理的。谢谢在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告诉我的方式。当我运行此代码时,当它开始尝试将文件添加到树视图时,我收到错误“对象引用未设置为对象的实例”。

1 个答案:

答案 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#家伙所以我使用转换器来改变代码。它应该工作,但你可能需要调整一点。