Создайте обозреватель решений, такой как Visual Studio - PullRequest
0 голосов
/ 17 июля 2010

Я хочу иметь возможность создавать древовидное представление, в котором его узлы могут формировать каталог на компьютере.В приведенном ниже коде я могу получить все файлы в список, но я не могу получить правильную папку.Я имею в виду, что в вашем пользовательском каталоге есть подкаталоги, такие как «Документы», «Музыка» и «Изображения».Когда вы запускаете этот код, он отображает их каждый как свой собственный узел, а не как вложенный.Я надеюсь это имеет смысл.Спасибо В 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 Ответ

2 голосов
/ 17 июля 2010

На первый взгляд кажется, что вы добавляете каждый найденный узел на корневой уровень дерева.

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 # парень, поэтому я использовал конвертер, чтобы изменить код. Это должно сработать, но вам, возможно, придется немного подправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...