Populate file revision to treeview

≯℡__Kan透↙ 提交于 2020-06-28 08:52:10

问题


I try to populate list of file revision to treeview. I have a list of revision file like a below.

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

Now, I would like to populate it like a

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

My idea is classified it by level

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

Then I use switch case to populate it to treeview

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

However, I don't know is it a right way to achieve my purpose. Is there any better way to do that?

Any help are appreciate and thanks so much


回答1:


You can take advantage of the repeated pattern of the TreeNodes paths ( #.# ). Create an array of them using the RegEx. If there is only one item in the array, then the path is of the root node, otherwise string join the array except the last item (to concat the parent's name) and use the TreeView.Nodes.Find(..) function to find the parent node of each path.

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

The result is:



来源:https://stackoverflow.com/questions/61435500/populate-file-revision-to-treeview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!