private void UpdateNodesInternal(TreeNodeCollection nodes) { List<TreeItem> children = GetChildren().ToList(); Dictionary<TreeItem, bool> shouldShow = children.ToDictionary(x => x, x => true); int i, j; for (i = 0, j = 0; j < children.Count; ) { TreeNode node = i < nodes.Count ? nodes[i] : null; TreeItem item = node != null ? node.Tag as TreeItem : null; if (children[j].Equals(item)) { children[j].UpdateInternal(node); i++; j++; } else if (node == null || (item != null && shouldShow.ContainsKey(item))) { nodes.Insert(i, children[j].CreateNode()); i++; j++; } else { nodes.RemoveAtWithSelectionBackup(i, nodes[i].TreeView, nodes[i].Parent); } } for (int k = nodes.Count - 1; k >= i; k--) nodes.RemoveAtWithSelectionBackup(k, nodes[k].TreeView, nodes[k].Parent); }