public void SelectCatalogNode(string path, int curID) { // find and select needed node SuspendLayout(); CatalogNode node = catalogNode; if (node == null) { ResumeLayout(); return; } char[] cpinChar = CatalogNode.CatalogPathInitial.ToCharArray(); string[] steps = path.Replace(" ", "").Trim(cpinChar).Split(cpinChar); for (int i = 0; i < steps.Length; i++) { Console.WriteLine("{0}: Step: {1} {2}", DateTime.Now.ToString("HH:mm:ss fff"), i, steps[i]); bool changed = false; // searching for node for (int j = 0; j < node.Nodes.Count && node.Nodes[j].Text != ""; j++) { var subNode = node.Nodes[j] as CatalogNode; if (subNode != null && subNode.Path == CatalogNode.CatalogPathInitial + steps[i]) { node = subNode; changed = true; break; } } if (changed) // node found { node.EnsureVisible(); } else // not found -> reloading { node.Nodes.Clear(); node.Nodes.Add(new TreeNode()); Console.WriteLine("{0}: Load subnodes", DateTime.Now.ToString("HH:mm:ss fff")); node.LoadSubNodes(); // searching for node again for (int j = 0; j < node.Nodes.Count; j++) { var subNode = (CatalogNode)node.Nodes[j]; if (subNode.Path == CatalogNode.CatalogPathInitial + steps[i]) { node = subNode; changed = true; break; } } } if (!changed) { break; } } node.SetCurID(curID); ResumeLayout(); SelectedNode = node; }