如果存在子节点,如何仅显示TreeView展开符号[+]

时间:2009-05-29 16:01:16

标签: sql database treeview lazy-loading

我开发了一个应用程序,它从数据库中的层次结构数据填充树视图。

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

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

这意味着我为没有子节点的节点获得了一个[+]图标,因此用户点击了展开图标,没有什么显示看起来有点粗制滥造。

在延迟加载树视图中处理子节点的preffrred方法是什么?如果我调用数据库来查看是否有子节点,那么我也可以加载子节点并忘记延迟加载吧?

我曾经想过在数据库中存储一个'HasChildren'标志,所以我可以选择性地为实际有子节点的节点创建我的虚拟子节点。

很抱歉,我很想知道其他人的想法......

3 个答案:

答案 0 :(得分:5)

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

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

你不必数数,可能很长。

只检查至少有一个孩子。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

重点是,如果为每个节点维护左右值,那么如果左值和右值相差多于一个,则该节点具有子节点。

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