首页 文章

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

提问于
浏览
3

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

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

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

image of treeview example

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

1 回答

  • 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
    

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

相关问题