我正在尝试更改节点的索引,因为有些特定节点始终需要位于树的底部。我试图更改 Node.Index,但这并没有改变任何东西。所以我的问题是:如何更改 PVirtualNode 的索引?
谢谢!- 杰夫
我正在尝试更改节点的索引,因为有些特定节点始终需要位于树的底部。我试图更改 Node.Index,但这并没有改变任何东西。所以我的问题是:如何更改 PVirtualNode 的索引?
谢谢!- 杰夫
要更改节点A的索引,请找到具有您希望A具有的索引的节点B ,然后调用. B和它之后的所有内容都将向下移动 1 为A腾出空间,并且它们的字段将被重新计算。即使A在树中尚不存在(例如在调用 之后),这也有效。Tree.MoveTo(A, B, amInsertBefore, False)
Index
MakeNewNode
如果您使用Index
将每个节点与其对应的列表或数组中的数据值相关联,那么您会发现这对于重新排序显示的值非常无效。
您无法更改节点的索引。通常,在使用时,VirtualStringTree
您将数据保存在与树分开的自己的数据结构中,并从事件中访问数据。您也可以将数据直接存储在节点中(使用记录),但我更喜欢另一种方法,因为它将逻辑排除在树视图之外。
例如,您可以将数据存储在列表中并在GetText
处理程序中访问此列表(您可以使用Node.Index
)。然后,如果您想重新排序项目,只需重新排序您的列表,其他一切都会自动发生(您可能需要Invalidate
在树上调用)。
伪代码:
初始化:
Tree.RootNodeCount := MyList.Count;
在GetText
事件中:
NodeText := MyList [Node.Index];
重新排序:
Reorder (MyList);
Tree.Invalidate;
TVirtualNode 是一个双向链表,它不是基于索引的结构:您可以通过删除节点并将其添加到您想要的位置来更改节点的索引。
查看DeleteNode
和AddChild
。
鉴于您仍在使用树视图控件作为容器,您无法使用 Smasher 提供的理想解决方案。
鉴于您的树视图没有层次结构(即它是一个列表),一个相当明显的解决方案是将该Sort
方法与您自己的比较函数 ( OnCompareNodes
) 一起使用。
另一个令人眼花缭乱的明显策略是将您想要的节点添加到最后。如果您以后需要添加其他节点,则将它们插入到特殊的最后一个节点上方,并带有InsertNode
. 正如您所描述的,这种简单的方法可能足以解决问题。