【问题标题】:Populate file revision to treeview将文件修订版填充到树视图
【发布时间】:2020-05-22 03:45:28
【问题描述】:

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

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 将其填充到树视图

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

但是,我不知道这是实现我的目的的正确方法。有没有更好的方法来做到这一点?

任何帮助都非常感谢和感谢

【问题讨论】:

  • 树是一种固有的递归结构。因此,应该使用递归来构建或遍历树。您可以将您的版本号拆分为数组,然后使用递归将同一索引处具有相同值的所有那些视为一个组,并递归遍历整个批次。和往常一样,先手动开发算法,然后编写代码来实现算法。
  • @jmcilhinney 这是一个伟大的理想。非常感谢您的解决方案。让我尝试用它来实现。 :)

标签: c# vb.net treeview revision


【解决方案1】:

您可以利用 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

结果是:

【讨论】:

  • 非常感谢您的详细实施。我试了一下,效果完全符合我的预期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多