【发布时间】:2014-12-20 15:08:11
【问题描述】:
我的应用程序(仍然基于 D2007)中有一个 TVirtualTreeview,它将 RootNodeCount 设置为所需的值,并且在 OnInitNode 事件中,我将一个对象分配给节点,否则该节点将存储在我的业务逻辑类的 TObjectList 中。该对象通过 Nopde 的 ID 从业务逻辑类中获取,该 ID 充当 TObjectList 的索引。
现在我向 VST 添加了排序功能,例如,这意味着向我的业务逻辑类添加一个比较方法,该方法将对象附加到 OnCompareNodes 事件传递的两个节点。到目前为止一切都很好,VST 本身就不错。
因为我希望业务逻辑具有与可以打印或导出数据相同的排序,并且它应该以相同的方式显示它,所以我想我会使用 TObjectList 的 .exchange 方法并简单地给出它是传递给 OnCompareNodes 的两个节点的 ID。
那失败了。我得到的输出和调试器支持这个是完全不同的。我对可能的原因感到很困惑。 当然,我可以在我的业务逻辑类中单独实现 TObjectList 的排序,并在 OnHeaderClick 事件结束时应用它,但这是我想避免的一些额外工作。
关于我可能做错什么或哪里做错的任何想法?
【问题讨论】:
-
您能改写一下这个问题吗?现在我知道您想通过使用 TreeView 对您的 ObjectList 进行排序(这不是 VST,不是吗?);这肯定不是你做的,对吗?
-
从这里很难说你是如何实现这个模式的,但听起来你好像缺少某种
CollectionView类。一个类,它将成为 VT 和您的源集合之间的一个层(并且会知道您的对象项的顺序)。在这种情况下,VT 可以作为一个真正的虚拟控件工作——它们的节点与数据无关。 -
关于 CollectionView 的想法:意味着我的业务逻辑将负责项目的顺序,并且永远不会使用 VST 的 OnCompareNode 我会告诉我的业务逻辑如何根据我在调用 OnHeaderClick 时发现的排序列等?然后我会清除 VST 并简单地再次设置 RootNodeCount 以便重绘?是这个主意吗?
-
是的。要点是您的源集合保持不变。集合视图的职责是为树准备项目,因为它们将被看到(其中项目只是指向源集合项目的指针,可以选择以某种方式排序、过滤或分组)。树本身只会知道该集合视图中有多少 可见 项 (
RootNodeCount)。然后树问例如对于OnGetText事件的文本,然后在其中询问集合视图数据,例如通过Node.Index。然后排序就像(在伪代码中)Tree.BeginUpdate; Collection.Sort; Tree.EndUpdate;。
标签: delphi sorting virtualtreeview