我使用 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 只出现在最后一级(它们没有子级)。 蓝色突出显示表明该事件正确隐藏了节点。
每个节点的可见性可以通过其所有子节点的逻辑或来评估。因此,即使它的子级之一是可见的(值为“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