我在WinForm应用程序中有TreeView
,我使用add
,reorder
和delete
方法添加新节点,重新排序现有节点并删除旧笔记
有时当我添加新项目时,它会立即在TreeView
中进行网络展示,但是当我添加下一个节点时 会正确显示。它似乎是随机发生的,因此很难找到根本原因。
即使节点未在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);
}
}
答案 0 :(得分:3)
您是否尝试过Invalidate()
与Refresh()
?刷新仅重绘客户端区域,而Invalidate重绘整个控件。这只是在黑暗中拍摄的......我以前从未遇到过这个问题。
答案 1 :(得分:1)
首先,在调用GetChildren方法之后,为什么还要将节点添加到树中呢?你应该只将它添加到树中,以防它的parentID为空(或者取决于它的类型为null或0)。
另外,将EnsureVisible
方法添加到新添加的节点,然后删除克隆:
...
if (u.sParentID==null)
{
TreeView1.Nodes["P1"].Nodes.Add(node);
node.EnsureVisible();
}
...
希望这有帮助
答案 2 :(得分:1)
如果我没弄错的话,那就没有了
TreeView1.BeginUpdate() method that you could use and at the end utilize the
TreeView1.EndUpdate();
答案 3 :(得分:1)
我认为这可能与克隆的使用有关,克隆会产生浅拷贝。由于使用Add方法,节点计数更新,但“new”节点仍然具有创建它的引用,因此它不是唯一对象。尝试创建一个深层副本,看看它是如何发生的。
e.g:
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;
}
然后将此节点作为子节点添加到您想要的父节点。