1

我开发了一个从数据库中的分层数据填充树视图的应用程序。

我将它设计为使用延迟加载,因此它仅在扩展节点时获取子节点。

我的问题是,除非我调用数据库并查看,否则显然我不知道节点是否有子节点。目前我已经实现了一个虚拟子节点,因此所有节点都会出现 [+] 图标,然后我删除这个虚拟节点并在BeforeExpand事件中获取真正的子节点。

这意味着对于没有子节点的节点,我会得到一个 [+] 图标,因此用户单击展开图标并且没有任何显示看起来有点粗制滥造。

在延迟加载树视图中处理子节点的首选方法是什么?如果我调用数据库以查看是否有子节点,那么我还不如只加载子节点而忘记延迟加载对吧?

我的一个想法是在数据库中存储一个“HasChildren”标志,这样我就可以有选择地只为实际上有子节点的节点创建我的虚拟子节点。

不好意思扯远了,我很想看看其他人的想法……

4

3 回答 3

5

当您拨打电话时,请检查子节点以及节点数据:

SELECT  tp.*, 
        (
        SELECT  1
        FROM    table tc
        WHERE   tc.parent = tp.id
        LIMIT 1
        ) AS has_children
FROM    table tp

你不必数,它可能很长。

只需检查是否存在至少一个孩子。

于 2009-05-29T16:18:17.203 回答
1

更改您的初始查询以返回所有相同的数据,但还要计算子项。当儿童计数不为零时,显示 [+]。发布您的架构和查询以获取计数

于 2009-05-29T16:06:02.067 回答
1

我对这个问题的首选解决方案是在您的分层数据集上实现预先排序的树遍历。有关示例实现,请参见http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 。

关键是,如果您为每个节点维护一个左右值,那么如果左右值相差一个以上,则该节点有子节点。

这种方法唯一值得注意的缺点是在更改节点结构时必须主动维护这些左右值。

于 2009-05-29T16:26:15.783 回答