Index: Core/Common/src/Core.Common.Controls.TreeView/TreeViewController.cs =================================================================== diff -u -r83e8ea6f186faad530933f5620faa91f1920d1e1 -rb8504088c9035ab8394bd564bf4747d0530db866 --- Core/Common/src/Core.Common.Controls.TreeView/TreeViewController.cs (.../TreeViewController.cs) (revision 83e8ea6f186faad530933f5620faa91f1920d1e1) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeViewController.cs (.../TreeViewController.cs) (revision b8504088c9035ab8394bd564bf4747d0530db866) @@ -281,7 +281,7 @@ treeNodeObserverLookup.Add(rootNode, new TreeNodeObserver(rootNode, this)); } - private void AddNode(TreeNode parentNode, object nodeData, int insertionIndex = -1) + private TreeNode CreateTreeNode(TreeNode parentNode, object nodeData) { var newNode = new TreeNode { @@ -295,16 +295,9 @@ UpdateNode(newNode); - if (insertionIndex != -1) - { - parentNode.Nodes.Insert(insertionIndex, newNode); - } - else - { - parentNode.Nodes.Add(newNode); - } - treeNodeObserverLookup.Add(newNode, new TreeNodeObserver(newNode, this)); + + return newNode; } private void RemoveAllNodes() @@ -352,35 +345,41 @@ private void RefreshChildNodes(TreeNode treeNode, TreeNodeInfo treeNodeInfo) { - var currentTreeNodes = treeNode.Nodes.OfType().ToList(); - var currentTreeNodesPerTag = currentTreeNodes.ToDictionary(ctn => ctn.Tag, ctn => ctn); + var newTreeNodes = new Dictionary(); + var outdatedTreeNodes = treeNode.Nodes.OfType().ToList(); + var currentTreeNodesPerTag = treeNode.Nodes.OfType().ToList().ToDictionary(ctn => ctn.Tag, ctn => ctn); var newChildNodeObjects = treeNodeInfo.ChildNodeObjects != null ? treeNodeInfo.ChildNodeObjects(treeNode.Tag) : new object[0]; - treeNode.Nodes.Clear(); - - foreach (var newChildNodeObject in newChildNodeObjects) + // Create a list of outdated tree nodes and new tree nodes + for (var i = 0; i < newChildNodeObjects.Length; i++) { - // Try to recycle any exiting node - if (currentTreeNodesPerTag.ContainsKey(newChildNodeObject)) + if (currentTreeNodesPerTag.ContainsKey(newChildNodeObjects[i])) { - var existingNode = currentTreeNodesPerTag[newChildNodeObject]; - - treeNode.Nodes.Add(existingNode); - currentTreeNodes.Remove(existingNode); + // Remove any node from the list of outdated nodes that should remain part of the node collection + outdatedTreeNodes.Remove(currentTreeNodesPerTag[newChildNodeObjects[i]]); } else { - // Create a new one otherwise - AddNode(treeNode, newChildNodeObject); + // If there's no existing node yet, create a new one and add it to the list of new nodes + newTreeNodes.Add(i, CreateTreeNode(treeNode, newChildNodeObjects[i])); } } - foreach (var removedNode in currentTreeNodes) + // Remove any outdated nodes + foreach (var removedNode in outdatedTreeNodes) { + treeNode.Nodes.Remove(removedNode); + RemoveTreeNodeFromLookupRecursively(removedNode); } + + // Insert any new nodes + foreach (var node in newTreeNodes) + { + treeNode.Nodes.Insert(node.Key, node.Value); + } } # region TreeView event handling