将文件修订版添加到树形视图中

问题描述 投票:0回答:1

我尝试将文件修订列表填充到treeview。我有一个修订文件列表,如下所示。

1.17
1.17.1.1
1.17.1.2
1.17.1.2.1.1    
1.17.1.2.1.2
1.17.1.2.1.2.1.1    
1.17.1.2.1.2.1.2
1.17.1.2.1.2.1.3
1.17.1.2.1.2.1.3.1.1
1.17.1.2.1.2.1.3.1.2
1.17.1.2.1.2.1.3.2.1
1.17.1.2.1.2.1.4    
1.17.1.2.1.2.1.5
1.17.1.2.1.2.1.5.1.1
1.17.1.2.1.2.1.5.1.2
1.17.1.2.1.2.1.5.1.2.1.1
1.17.1.2.1.3
1.17.1.2.1.4
1.18
1.19

现在,我想像一个人一样填充它

1.17
    1.17.1.1
    1.17.1.2
        1.17.1.2.1.1    
        1.17.1.2.1.2
            1.17.1.2.1.2.1.1    
            1.17.1.2.1.2.1.2
            1.17.1.2.1.2.1.3
                1.17.1.2.1.2.1.3.1.1
                1.17.1.2.1.2.1.3.1.2
                1.17.1.2.1.2.1.3.2.1    
            1.17.1.2.1.2.1.4    
            1.17.1.2.1.2.1.5    
                1.17.1.2.1.2.1.5.1.1
                1.17.1.2.1.2.1.5.1.2    
                    1.17.1.2.1.2.1.5.1.2.1.1        
        1.17.1.2.1.3
        1.17.1.2.1.4                        
1.18
1.19

我的想法按级别分类

1.17         -> level 1
1.17.1.1     -> level 2
1.17.1.2     -> level 2
1.17.1.2.1.1 -> level 3
...

然后我使用开关盒将其填充到树视图中

if level = 1 then parent node
else if level = 2 then child node
else if level = 3 then grandchild node
...

但是,我不知道这是实现我的目标的正确方法。有更好的方法吗?

非常感谢任何帮助,谢谢

c# vb.net treeview revision
1个回答
0
投票

您可以利用TreeNodes路径的重复模式(#。#)。使用RegEx创建一个数组。如果数组中只有一项,则该路径是根节点的路径;否则,将最后一项除外的字符串串连到数组中(以连接父项的名称),并使用TreeView.Nodes.Find(..)函数查找每个路径的父级节点。

C#

private void PopulateTree(IEnumerable<string> paths)
{
    foreach (var path in paths.OrderBy(x => x))
    {
        var node = new TreeNode { Name = path, Text = path };
        var arr = Regex.Matches(path, @"\d+.\d+")
            .Cast<Match>().Select(x => x.Value).ToArray();

        if (arr.Count() == 1)
            treeView1.Nodes.Add(node);
        else
        {
            var parentPath = string.Join(".", arr, 0, arr.Count() - 1);
            var parentNode = treeView1.Nodes.Find(parentPath, true).FirstOrDefault();

            if (parentNode != null)
                parentNode.Nodes.Add(node);
        }
    }
}

private void TheCaller()
{
    var revisionsList = //Get the list...

    treeView1.SuspendLayout();
    treeView1.Nodes.Clear();
    PopulateTree(revisionsList);
    treeView1.ResumeLayout();
}

VB.NET

Private Sub PopulateTree(paths As IEnumerable(Of String))
    For Each path In paths.OrderBy(Function(x) x)
        Dim node As New TreeNode With {.Name = path, .Text = path}
        Dim arr = Regex.Matches(path, "\d+.\d+").
            Cast(Of Match).Select(Function(x) x.Value).ToArray()

        If arr.Count = 1 Then
            TreeView1.Nodes.Add(node)
        Else
            Dim parentPath = String.Join(".", arr, 0, arr.Count() - 1)
            Dim parentNode = TreeView1.Nodes.Find(parentPath, True).FirstOrDefault

            If parentNode IsNot Nothing Then
                parentNode.Nodes.Add(node)
            End If
        End If
    Next
End Sub

Private Sub TheCaller()
    Dim revisionsList = 'Get the list...

    TreeView1.SuspendLayout()
    TreeView1.Nodes.Clear()
    PopulateTree(revisionsList)
    TreeView1.EndUpdate()
End Sub

结果是:

SOQ60904806

© www.soinside.com 2019 - 2024. All rights reserved.