TreeView是随机失败显示新添加的节点

我在WinForm应用程序中有一个TreeView ,我使用addreorderdelete方法来添加新节点,重新sorting现有节点并删除旧笔记。

有时当我添加一个新的项目时,它会立即在TreeView 显示networking,但是当我添加下一个节点时它确实显示正确。 这似乎是随机发生的,所以很难find根本原因。

即使节点在UI中没有正确显示,节点数也是正确的。

 TreeView1.BeginUpdate(); TreeView1.Nodes.Add("P1", "Parent"); foreach(User u in items) { if( condition) { node.Text =u.sNodeText; node.Tag = u; node.Text = u.sNodeText; GetChildren(node); TreeView1.Nodes["P1"].Nodes.Add((TreeNode)node.Clone()); } } TreeView1.ExpandAll(); TreeView1.EndUpdate(); TreeView1.Refresh(); 

谁能回答这个问题吗? 我认为这个问题不是没有意义的。 这是GetChildren方法。

  private void GetChildren(TreeNode node) { TreeNode Node = null; User nodeCat = (User)node.Tag; foreach (User cat in items) { if (cat.sParentID == nodeCat.sID) { Node = node.Nodes.Add(cat.sNodeText); Node.Tag = cat; GetChildren(Node); } } 

你有尝试过Invalidate()Refresh() ? 刷新只重绘客户区域,而无效重画整个控件。 这只是在黑暗中的一枪…我以前从来没有遇到过这个问题。

首先,在调用GetChildren方法之后,为什么要将节点添加到树中呢? 你应该只把它添加到树的情况下,其parentID为空(或null或0,取决于它的类型)。 另外,将EnsureVisible方法添加到新添加的节点,并删除克隆:

 ... if (u.sParentID==null) { TreeView1.Nodes["P1"].Nodes.Add(node); node.EnsureVisible(); } ... 

希望这可以帮助

如果我没有错,是不是有一个

 TreeView1.BeginUpdate() method that you could use and at the end utilize the TreeView1.EndUpdate(); 

我认为这可能与使用产生浅拷贝的克隆相关。 由于使用了Add方法,节点计数被更新,但“新”节点仍然具有从创建它的引用,所以它不是唯一的对象。 尝试创建一个深层的副本,看看如何。

例如:

 public TreeNode DeepNodeClone(TreeNode src) { MemoryStream ms = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms, src); ms.Position = 0; object obj = bf.Deserialize(ms); ms.Close(); return (TreeNode)obj; } 

然后将此节点作为子节点添加到所需的父节点。