将文件修订填充到树视图

Populate file revision to 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
...

然后我使用 switch case 将其填充到 treeview

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

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

感谢任何帮助,非常感谢

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

C#

private void PopulateTree(IEnumerable<string> paths)
{
    treeView1.BeginUpdate();
    treeView1.Nodes.Clear();

    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);
        }
    }

    treeView1.EndUpdate();
}

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

    PopulateTree(revisionsList);    
}

VB.NET

Private Sub PopulateTree(paths As IEnumerable(Of String))
    TreeView1.BeginUpdate()
    TreeView1.Nodes.Clear()

    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

    TreeView1.EndUpdate()
End Sub

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

    PopulateTree(revisionsList)
End Sub

结果是: