【问题标题】:How to only display a TreeView expand sign [+] if children exist如果存在子级,如何仅显示 TreeView 展开符号 [+]
【发布时间】:2009-05-29 16:01:15
【问题描述】:

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

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

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

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

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

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

对不起,我很想看看其他人的想法......

【问题讨论】:

  • 顺便说一句:这是 Visual Studio 2005 中的 Treeview

标签: sql database treeview lazy-loading


【解决方案1】:

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

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

你不必数,可能很长。

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

【讨论】:

  • 这个非常简单易行的脚本的开头!如果需要过滤掉非子元素,最后加HAVING has_children =1
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      相关资源
      最近更新 更多