создать древовидный узел на основе структуры URL .net - PullRequest
0 голосов
/ 29 октября 2011

я пытаюсь создать основу для узлов узлов древовидной структуры на основе структуры каталогов, как это

Dim arrLinks() As String = Split(Url, "/")

For i As Integer = 0 To arrLinks.Length
    If tvwDirs.Nodes.ContainsKey(arrLinks(0)) = False Then
        tvwDirs.Nodes.Add(arrLinks(0), arrLinks(0))
    End If
Next

Приведенный выше код работает для добавления базового / родительского узла

скажем, у меня есть urllike this example.com/dir1/dir2/file

в этом случае он должен создать дочерний узел dir2 в родительском узле dir1

, который запутался, добавив дочерние узлы к существующим узлам

Ответы [ 2 ]

1 голос
/ 29 октября 2011

Первая проблема, с которой вы столкнетесь, - это исключение, основанное на вашем заявлении for; Вы должны либо изменить его на:

For i As Integer = 0 To arrLinks.Length - 1

или, мои предпочтения:

For each nodeKey as String in arrLinks

Следующая проблема заключается в том, что коллекция узлов не содержит все узлы во всем дереве, она содержит только узлы верхнего уровня. Каждый узел в этом списке имеет свой собственный набор дочерних узлов, и каждый из этих дочерних узлов имеет дочерние узлы и т. Д.

Это означает, что при добавлении каждого узла вам необходимо отслеживать последний родительский узел и добавлять следующего дочернего к этому родительскому узлу или отслеживать текущую коллекцию узлов для уровня, к которому вы добавляете.

Это приведет к коду, подобному следующему (вам может потребоваться настроить имена классов для NodeCollection и Node и, возможно, оператор Add (не забывайте, если add возвращает Node или нет)):

Dim arrLinks() As String = Split(Url, "/")
Dim cNodes as NodeCollection

' Keep track of the current collection of nodes, starting with the tree's top level collection
cNodes = tvwDirs.Nodes

For each nodeKey As String in arrLinks
    Dim currentNode as Node

    If Not cNodes.ContainsKey(nodeKey) Then
        ' If the key is not in the current collection of nodes, add it and record the resultant record
        currentNode = cNodes.Add(nodeKey, nodeKey)
    Else
        ' Otherwise, record the current node
        currentNode = cNodes(nodeKey)
    End If
    ' Store the set of nodes that the next nodeKey will be added to
    cNodes = currentNode.Nodes
Next
0 голосов
/ 29 октября 2011

Не проверено, может содержать синтаксические или орфографические ошибки:

Sub MakeTreeNodes
  Dim tURI As Uri = New Uri("proto://domain.tld/dir1/dir2/dir3")
  Dim tNode as TreeNode = New TreeNode(tURI.DnsSafeHost)

  If 1 < tURI.Segments.Length
    CreateNode(tURI.Segments, 1, tNode)
  End If

  SomeTreeView.Nodex.Add(tNode)

End Sub


Private Sub CreateNode(byval tSegments() As String, ByVal tIndex As Int16, ByRef tParentNode As TreeNode) As TreeNode

  Dim tNode As TreeNode = New TreeNode(tSegments(tIndex))

  If (tSegments.Length - 1) < tIndex
    CreateNode(tSegments, tIndex + 1, tNode)
  End If

  tParentNode.Nodes.Add(tNode)

End Function

Краткое объяснение: MakeTreeNodes () является точкой входа. Я бы предложил изменить его так, чтобы он принимал строковый URL, а также, возможно, перегрузку для URI. Создает корневой узел с anme хоста URI.

Затем вызывается рекурсивная функция CreateNode (). Это создает новый TreeNode с текущим сегментом, а затем вызывает себя, передавая вновь созданный узел и следующее значение индекса. Это довольно стандартная функция для рекурсивной функции.

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