/// <summary> /// Copies tree from data to display. /// Returns "bindings", mapping data->display (so, if you have data node, you can find it's counterpart on display) /// /// filter method is called for each data node, and if returns false, display node is not created (and data children are not iterated) /// updateAction is called for each newly created display node, first parameter is data node, second one is display node /// </summary> /// <returns></returns> public static TreeNodeBindings CopyTree(TreeView data, TreeView display, Func <TreeNode, bool> filter, Action <TreeNode, TreeNode> updateAction) { var bindings = new TreeNodeBindings(); display.Nodes.Clear(); CopyTree(data.Nodes, display.Nodes, bindings, filter ?? (_ => true), updateAction ?? ((dataNode, displayNode) => { })); return(bindings); }
private static void CopyTree(TreeNodeCollection source, TreeNodeCollection target, TreeNodeBindings bindings, Func <TreeNode, bool> filter, Action <TreeNode, TreeNode> updateAction) { foreach (TreeNode node in source) { if (!filter(node)) { continue; } TreeNode newNode; if (node is TreeNodeWithConnectionInfo) { newNode = ((TreeNodeWithConnectionInfo)node).CloneShallow(); } else { newNode = CloneShallow(node); } target.Add(newNode); bindings.BindNodes(node, newNode); CopyTree(node.Nodes, newNode.Nodes, bindings, filter, updateAction); if (node.IsExpanded) { newNode.Expand(); } updateAction(node, newNode); } }