Index: Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs =================================================================== diff -u -r4225ced13a23a9309f0178dc508ad713b88fb1dd -r443aa7870cdfc2a463a1e5f261e71c11188c4f2f --- Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision 4225ced13a23a9309f0178dc508ad713b88fb1dd) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision 443aa7870cdfc2a463a1e5f261e71c11188c4f2f) @@ -452,44 +452,42 @@ OnNodeDataDeleted(treeNode); } - private void CollapseAll(TreeNode treeNode, bool performUpdate = true) + private void CollapseAll(TreeNode treeNode) { - if (performUpdate) - { - treeView.BeginUpdate(); - } + treeView.BeginUpdate(); + CollapseNodeAndChildNodes(treeNode); + + treeView.EndUpdate(); + } + + private static void CollapseNodeAndChildNodes(TreeNode treeNode) + { treeNode.Collapse(); foreach (TreeNode childNode in treeNode.Nodes) { - CollapseAll(childNode, false); + CollapseNodeAndChildNodes(childNode); } - - if (performUpdate) - { - treeView.EndUpdate(); - } } - private void ExpandAll(TreeNode treeNode, bool performUpdate = true) + private void ExpandAll(TreeNode treeNode) { - if (performUpdate) - { - treeView.BeginUpdate(); - } + treeView.BeginUpdate(); + ExpandNodeAndChildNodes(treeNode); + + treeView.EndUpdate(); + } + + private static void ExpandNodeAndChildNodes(TreeNode treeNode) + { treeNode.Expand(); foreach (TreeNode childNode in treeNode.Nodes) { - ExpandAll(childNode, false); + ExpandNodeAndChildNodes(childNode); } - - if (performUpdate) - { - treeView.EndUpdate(); - } } /// @@ -609,22 +607,18 @@ private void RefreshChildNodes(TreeNode treeNode, TreeNodeInfo treeNodeInfo) { IList newlyAddedTreeNodes = new List(); - object[] newChildNodeObjects = treeNodeInfo.ChildNodeObjects != null + object[] expectedChildNodes = treeNodeInfo.ChildNodeObjects != null ? treeNodeInfo.ChildNodeObjects(treeNode.Tag) : new object[0]; - for (var i = 0; i < newChildNodeObjects.Length; i++) + for (var i = 0; i < expectedChildNodes.Length; i++) { - // Remove any outdated node at the current position - if (treeNode.Nodes.Count > i && !newChildNodeObjects.Contains(treeNode.Nodes[i].Tag)) + if (treeNode.Nodes.Count > i) { - TreeNode nodeToRemove = treeNode.Nodes[i]; - - treeNode.Nodes.Remove(nodeToRemove); - RemoveTreeNodeFromLookupRecursively(nodeToRemove); + RemovePossiblyOutdatedChildNode(treeNode, treeNode.Nodes[i], expectedChildNodes); } - object newChildNodeObject = newChildNodeObjects[i]; + object newChildNodeObject = expectedChildNodes[i]; // Continue on correct node if (treeNode.Nodes.Count > i && newChildNodeObject.Equals(treeNode.Nodes[i].Tag)) @@ -658,7 +652,7 @@ } // Remove any outdated nodes at the end - IEnumerable outdatedTreeNodes = treeNode.Nodes.Cast().Skip(newChildNodeObjects.Length).ToList(); + IEnumerable outdatedTreeNodes = treeNode.Nodes.Cast().Skip(expectedChildNodes.Length).ToList(); foreach (TreeNode outdatedNode in outdatedTreeNodes) { treeNode.Nodes.Remove(outdatedNode); @@ -668,6 +662,15 @@ SelectLastNewNode(newlyAddedTreeNodes); } + private void RemovePossiblyOutdatedChildNode(TreeNode parentNode, TreeNode possiblyOutdatedChildNode, IEnumerable expectedChildNodes) + { + if (!expectedChildNodes.Contains(possiblyOutdatedChildNode.Tag)) + { + parentNode.Nodes.Remove(possiblyOutdatedChildNode); + RemoveTreeNodeFromLookupRecursively(possiblyOutdatedChildNode); + } + } + private void SelectLastNewNode(IEnumerable newTreeNodes) { TreeNode lastAddedNodeToSetSelectionTo = newTreeNodes.LastOrDefault(node =>