Exemplo n.º 1
0
        protected void btnTraverseNodes_Click(object sender, EventArgs e)
        {
            string result = string.Empty;

            ASTreeView.ASTreeNodeHandlerDelegate nodeDelegate = delegate(ASTreeViewNode node)
            {
                if (!node.Equals(this.astvMyTree.RootNode))
                {
                    result += ("[NODE:]" + node.NodeText + "[PARENT-NODE:]" + node.ParentNode.NodeText + "<br />");
                }
            };

            astvMyTree.TraverseTreeNode(this.astvMyTree.RootNode, nodeDelegate);

            this.divConsole.InnerHtml += (string.Format(">>nodes traverse: <div style='padding-left:20px;'>{0}</div>", result));
        }
        /// <summary>
        /// save the original tree nodes to session for comparison later
        /// </summary>
        private void SaveOriginalTreeNodes()
        {
            //create a hashtable to store nodes
            Hashtable ht = new Hashtable();

            ASTreeView.ASTreeNodeHandlerDelegate nodeDelegate = delegate(ASTreeViewNode node)
            {
                //skip RootNode
                if (node.Equals(this.astvMyTree.RootNode))
                {
                    return;
                }

                //assume NodeValue is unique
                ht.Add(node.NodeValue, node);
            };

            astvMyTree.TraverseTreeNode(this.astvMyTree.RootNode, nodeDelegate);

            //set the session
            this.OriginalTreeNodes = ht;
        }
        /// <summary>
        /// compare to the OriginalTreeNodes to find the nodes which have been changed
        /// </summary>
        private void ResolveTreeNodesModification()
        {
            //the result string
            StringBuilder sb = new StringBuilder();

            #region traverse all the nodes, detect new nodes, modified nodes
            //traverse all the nodes, detect new nodes, modified nodes
            ASTreeView.ASTreeNodeHandlerDelegate nodeDelegate = delegate(ASTreeViewNode node)
            {
                //skip RootNode
                if (node.Equals(this.astvMyTree.RootNode))
                {
                    return;
                }

                object obj = this.OriginalTreeNodes[node.NodeValue];
                //if node is a new node, it can't be found in the OriginalNodes
                if (obj == null)
                {
                    sb.Append(string.Format("[NEW] Node: {0} <br />", node.NodeText));
                }
                else
                {
                    ASTreeViewNode originalNode = (ASTreeViewNode)obj;

                    //if the node has been changed
                    //compare, here I just demo NodeText and ParentNodeId
                    if (node.NodeText != originalNode.NodeText)
                    {
                        sb.Append(string.Format("[TEXT CHANGED]NodeText changed! Original Text:{0}, New Text: {1} <br />", originalNode.NodeText, node.NodeText));
                    }

                    if (node.ParentNode.NodeValue != originalNode.ParentNode.NodeValue)
                    {
                        sb.Append(string.Format("[PARENT CHANGED]Node's parent changed! Original Parent: {0}, New Parent: {1} <br />", originalNode.ParentNode.NodeText, node.ParentNode.NodeText));
                    }

                    int oldPos = originalNode.ParentNode.IndexOf(originalNode);
                    int newPos = node.ParentNode.ChildNodes.IndexOf(node);
                    if (newPos != oldPos)
                    {
                        sb.Append(string.Format("[POSITION CHANGED]Node's position changed! Original Position: {0}, New Position: {1} <br />", oldPos, newPos));
                    }
                }
            };

            //do traverse
            astvMyTree.TraverseTreeNode(this.astvMyTree.RootNode, nodeDelegate);

            #endregion

            #region find deleted nodes

            //find deleted nodes
            List <string> originalNodesKeys = new List <string>();
            foreach (string key in this.OriginalTreeNodes.Keys)
            {
                originalNodesKeys.Add(key);
            }

            //traverse all the nodes, detect new nodes, modified nodes
            ASTreeView.ASTreeNodeHandlerDelegate nodeDeleteDelegate = delegate(ASTreeViewNode node)
            {
                //skip RootNode
                if (node.Equals(this.astvMyTree.RootNode))
                {
                    return;
                }

                if (originalNodesKeys.Contains(node.NodeValue))
                {
                    originalNodesKeys.Remove(node.NodeValue);
                }
            };

            //do traverse
            astvMyTree.TraverseTreeNode(this.astvMyTree.RootNode, nodeDeleteDelegate);

            //keys remain in the originalNodesKeys are the deleted nodes
            foreach (string deletedNodeKey in originalNodesKeys)
            {
                sb.Append(string.Format("[NODE DELETED]Original Node: {0}<br />", deletedNodeKey));
            }

            #endregion



            this.divConsole.InnerHtml += (string.Format(">>The following nodes have been changed: <div style='padding-left:20px;'>{0}</div>", sb.ToString()));
        }