2010-07-16 64 views
0

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

回答

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#人,所以我使用转换器来更改代码。它应该可以工作,但你可能需要稍微调整一下。

+0

非常感谢。如果我是注册用户,我会为您投票。反正+1 – muckdog12 2010-07-16 23:08:11

相关问题