我尝试将文件修订列表填充到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
...
但是,我不知道这是实现我的目标的正确方法。有更好的方法吗?
非常感谢任何帮助,谢谢
您可以利用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
结果是: