将选项卡式文本转换为树视图

时间:2017-01-06 22:44:06

标签: vb.net winforms recursion treeview

在VB.NET中,如何以这种格式转换多行字符串......

Area 52
   Sector 19
      Stage 7
      Library 15
   Sector 32
      Link 30
      Portal 20`

...(每个缩进是一个 vbTab ),进入如下所示的树视图控件:

image of treeview example

我认为递归函数可以正常工作,但我不知道如何创建一个正常工作的函数。

1 个答案:

答案 0 :(得分:2)

首先,你需要解析你的字符串。创建一个将存储数据的对象。在伪代码中:

class Node
    Text as string
    Level as Integer
end class

现在,您需要填写这些节点的列表

dim lines() as string = myString.split(Environment.NewLine)

迭代并调查行

Dim nodeList as new List(Of Node)()
for each line as string in lines
    dim lenBefore as integer = line.Length
    dim lenAfter as integer = line.Trim().Length
    dim n as new Node()
    n.Text = line.Trim()
    n.Level = (lenBefore - lenAfter) / numberOfEmptySpacesInIndent 'for example indent 4 spaces
next

现在,您已拥有该列表,您需要将其转换为Treeview

dim previousTreeNode as TreeNode
dim previousNode as Node

for each n as Node In nodeList
    ' here create new tree node using n.Text       
    dim newTreeNode = .....

    if n.Level = 0 then 
        tv.Nodes.Add(newTreeNode)
    else if n.Level = previousNode.Level Then
        previousTreeNode.Parent.Nodes.Add(newTreeNode)
    else if n.Level > previousNode.Level Then
        previousTreeNode.Nodes.Add(newTreeNode)
    else if n.Level < previousNode.Level Then
        previousTreeNode.Parent.Parent.Nodes.Add(newTreeNode)
    end if

    previousNode = n
    previousTreeNode = newTreeNode

next

这应该这样做。虽然,这是伪代码,我还没有测试任何东西。如果你想要递归,你需要在行之间建立关系。此代码基于缩进并且没有任何关系。我猜,有可能,一旦你获得了基于缩进的级别,你就可以遍历节点列表以找到父级并添加属性。是的,如果您创建该对象结构,则很容易将其复制到树节点中。但那是双重工作。