TreeList - 当子节点不存在时隐藏节点

问题描述 投票:0回答:1

我使用 DevExpress Framework 在 VB.net 中进行开发。 我遇到了 DevExpress TreeList 控件的问题,这不是控件本身的问题,而是隐藏特定节点的算法的问题。我找不到合适的解决方案。

问题:

复选框会触发事件来隐藏没有节点的节点 [类型]“GLAccount”。下面的代码片段只适用于隐藏 GLAccounts 的父母,但它不会向上继承信息(祖父母及其父母)以使它们也看不见。 只要不存在任何具有[类型]“GLAccount”的节点,父节点就应该不可见,但如果兄弟节点具有“GLAccounts”,那么并非所有父节点都应该是不可见的。

复选框事件:

Private Sub BarCheckItem1_CheckedChanged_2(sender As Object, e As ItemClickEventArgs) Handles bciHideEmptyAccounts.CheckedChanged
        If CType(bciHideEmptyAccounts.Checked, Boolean) Then
            hideNodesRecursive(treeListLeft.Nodes, False)
        Else
            hideNodesRecursive(treeListLeft.Nodes, True)
        End If
    End Sub

Sub 由 Checkbox 事件触发,具体取决于 Checkbox 值是否为真/假:

 Private Sub hideNodesRecursive(ByVal nodes As TreeListNodes, ByVal bHide As Boolean)
        For Each node As TreeListNode In nodes
            If node.HasChildren Then
                hideNodesRecursive(node.Nodes, bHide)
            Else
                If Not CType(node.GetValue("Type"), String) = "GLAccount" Then
                    node.Visible = bHide
                End If
            End If
        Next
    End Sub

用例 1:给出的结构显示了不同级别的节点。 GLAccounts 只出现在最后一级(它们没有子级)。 蓝色突出显示表明该事件正确隐藏了节点。

结果:之前蓝色突出显示的节点消失了。

使用案例 2:同样,蓝色高亮节点将被正确隐藏,但橙色节点仍然可见。

结果:

vb.net recursion devexpress treelist xtratreelist
1个回答
0
投票

每个节点的可见性可以通过其所有子节点的逻辑或来评估。因此,即使它的子级之一是可见的(值为“GLAccount”),它也应该是可见的。

我稍微改变了 BarCheckItem1_CheckedChanged 例程。还添加了一个简单的子来显示所有节点(Show_Nodes),因为在 DevExpress 文档中找不到任何方法来设置所有树列表节点的可见性。

在发这篇文章时无法检查代码,但逻辑上是正确的。

Private Sub BarCheckItem1_CheckedChanged(sender As Object, e As EventArgs) Handles bciHideEmptyAccounts.CheckedChanged
    IF bciHideEmptyAccounts.Checked THEN
        hideNodesRecursive(TreeListLeft.Nodes)
    ELSE
        Show_Nodes(TreeListLeft.nodes)
    END IF
End Sub


Private Sub hideNodesRecursive(ByVal nodes As TreeListNodes)
    For Each node As TreeListNode In nodes
        node.visible= CSTR(node.GetValue("Type")).equals("GLAccount")
        IF NOT isnothing(node.parentnode) THEN
            node.parentnode.visible= (node.parentnode.visible OR node.visible)
        END IF
        hideNodesRecursive(node.Nodes)
    Next
End Sub


SUB Show_Nodes(nodes AS treelistnodes)
    FOR EACH node AS treelistnode IN nodes
        node.visible= TRUE
        Show_Nodes(node.nodes)
    NEXT
END SUB
© www.soinside.com 2019 - 2024. All rights reserved.