private void modifyingNode_Complete() { if (InvokeRequired) { Invoke(new WorkerDelegate(modifyingNode_Complete)); return; } if (finishedModification.Count == 0) { return; } DBNode <T> node = finishedModification.Pop(); TreeNode treeNode = treeNodeLookup[node]; NodeModifiedDetails details = modificationDetails[node]; rebuildingNode = false; // re-add the node try { if (details.Parent == null) { treeView.Nodes.Insert(details.Index, treeNode); } else { details.Parent.Nodes.Insert(details.Index, treeNode); } } catch (Exception e) { if (e is ThreadAbortException) { throw e; } } treeView.SelectedNode = treeNode; modificationDetails.Remove(node); }
void nodeModified(IDBNode node) { if (modificationDetails.ContainsKey((DBNode <T>)node)) { return; } if (treeNodeLookup.ContainsKey((DBNode <T>)node) && this.Visible) { // store modification details TreeNode treeNode = treeNodeLookup[(DBNode <T>)node]; NodeModifiedDetails details = new NodeModifiedDetails(); details.Index = treeNode.Index; details.Parent = treeNode.Parent; modificationDetails[(DBNode <T>)node] = details; pendingModification.Push((DBNode <T>)node); // temporarily remove the node rebuildingNode = true; if (details.Parent == null) { treeView.Nodes.Remove(treeNode); } else { details.Parent.Nodes.Remove(treeNode); } // add a dummy node so the user doesnt freak out // update the node in a new thread while displaying a progress dialog ProgressPopup popup = new ProgressPopup(new WorkerDelegate(nodeModifiedWorker)); popup.Owner = FindForm(); popup.Text = "Updating Menu Items"; popup.WorkComplete += new WorkCompleteDelegate(modifyingNode_Complete); popup.ShowDialogDelayed(300); } }