我在WinForm应用程序中有一个TreeView
,我使用add
, reorder
和delete
方法来添加新节点,重新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; }
然后将此节点作为子节点添加到所需的父节点。