在VirtualStringTree中设置节点的索引?

时间:2011-02-07 18:56:41

标签: delphi virtualtreeview

我正在尝试更改节点的索引,因为有些特定节点始终需要位于树的底部。我试图改变Node.Index,但这并没有改变任何东西。所以我的问题是:如何更改PVirtualNode的索引?

谢谢! - 杰夫

4 个答案:

答案 0 :(得分:4)

要更改节点 A 的索引,请找到具有您希望 A 所拥有的索引的节点 B ,然后调用{ {1}}。 B 以及之后的所有内容都会向下移动一个以便为 A 腾出空间,并且会重新计算其Tree.MoveTo(A, B, amInsertBefore, False)字段。即使树中尚不存在 A (例如在调用Index之后),这也有效。

如果您使用MakeNewNode将每个节点与列表或数组中的相应数据值相关联,那么您会发现这对重新排序显示的值基本上无效。

答案 1 :(得分:3)

您可以更改节点的索引。通常在使用VirtualStringTree时,您将自己的数据保存在与树无关的数据结构中,并从事件中访问数据。 您也可以直接在节点中存储数据(使用记录),但我更喜欢其他方法,因为它使逻辑不在树视图中。

例如,您可以将数据存储在列表中,并在GetText处理程序中访问此列表(您可以使用Node.Index)。然后,如果您想重新排序项目,只需重新排序列表,其他所有内容都会自动发生(您可能需要在树上调用Invalidate)。

<强>伪代码:

初​​始化:

Tree.RootNodeCount := MyList.Count;

GetText事件中:

NodeText := MyList [Node.Index];

重新排序:

Reorder (MyList);
Tree.Invalidate;

答案 2 :(得分:2)

TVirtualNode是一个双向链接列表,它不是基于索引的结构:您可以通过删除节点并将其添加到您想要的位置来更改节点的索引。

查看DeleteNodeAddChild

答案 3 :(得分:2)

鉴于您仍在使用树视图控件作为容器,因此您无法使用Smasher提供的理想解决方案。

一个相当明显的解决方案,假设您的树视图没有层次结构(即它是一个列表)将使用Sort方法和您自己的比较函数(OnCompareNodes)。

另一个非常明显的策略是在最后添加你想要的节点。如果以后需要添加其他节点,请将它们插入到具有InsertNode的特殊最后一个节点上方。正如您所描述的那样,这种简单的方法可能就足够了。