public async Task CreateTree(TreeNodeItem node, TreeView control, SynchronizationContext c) { TreeNode root = null; c.Send((s) => { control.Nodes.Clear(); root = control.Nodes.Add("root"); }, null); await Task.Run(async() => { foreach (var item in node.Nodes) { await WalkTree(control, c, item, root); } }); }
async Task <TreeNodeItem> MakeTree(NameContainer[] names) { return(await Task.Run <TreeNodeItem>(async() => { var root = new TreeNodeItem { Name = "root" }; foreach (var name in names) { var path = name.Name; await WalkPath(root, path, path, name); } return root; })); }
async Task WalkTree(TreeView control, SynchronizationContext c, TreeNodeItem nodeItem, TreeNode node) { TreeNode newNode = null; c.Send((s) => { newNode = node.Nodes.Add(nodeItem.Name); newNode.Tag = nodeItem; }, null); await Task.Run(async() => { if (!nodeItem.Final) { foreach (var item in nodeItem.Nodes) { await WalkTree(control, c, item, newNode); } } }); }
async Task WalkPath(TreeNodeItem node, string path, string fullpath, NameContainer name) { await Task.Run(async() => { var pathArray = path.Split('.'); if (pathArray == null || pathArray.Length <= 1) { if (!node.Nodes.Any(p => p.Path == path)) { var next = new TreeNodeItem { Path = path, Name = path, Final = true, NameContainer = name }; node.Nodes.Add(next); } } else { var newPath = string.Join(".", pathArray.Skip(1)); var curPath = string.Join(".", pathArray.Take(1)); TreeNodeItem next = null; if (!node.Nodes.Any(p => p.Path == curPath)) { next = new TreeNodeItem { Name = pathArray[0], Path = curPath }; node.Nodes.Add(next); } else { next = node.Nodes.First(p => p.Path == curPath); } await WalkPath(next, newPath, fullpath, name); } }); }