Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        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);
            }
        }