如何优化将数据加载到树视图中

时间:2017-01-30 15:46:24

标签: .net vb.net winforms treeview

我想在VB.NET应用程序中优化多个树视图的加载时间。每个树视图的结构基于数据库表,其信息由数据集表示。 每个表都有一个ID和一个Parent_ID,这意味着每个表都包含一个分层结构。因此,有必要使用有助于创建正确结构的代码来填充每个树视图。

Private Function setTreenodeCollection(ByRef inDataset As DataSet, _
                                        ByVal tblName As String, _
                                        Optional ByVal inUseCheckboxes As Boolean = True)
    Dim resultSet As New TreeNodeCollection
    Dim nodes As New List(Of cls_TreeNode_Exp)
    If Not dr.RowState = DataRowState.Deleted And dr("Description", DataRowVersion.Original).ToString.Length > 0 Then
    Dim NodeAkt As cls_TreeNode_Exp = New cls_TreeNode_Exp(dr, dr("Description"), dr("ID"), typ, inUseCheckboxes, icon)
    nodes.Add(NodeAkt)

    Dim childNodes As List(Of cls_TreeNode_Exp) = (From node As cls_TreeNode_Exp In nodes
                                                        Where node.DR("ID_parent") = 0
                                                        Select node).ToList

    For Each node As cls_TreeNode_Exp In childNodes
        nodes.Remove(node)
        resultSet.Add(node)

        Me.getChildNodes(nodes, node)
    Next

    Return resultSet
End Function


Private Sub getChildNodes(inNodes As List(Of cls_TreeNode_Exp), inParentNode As cls_TreeNode_Exp)
    Dim childNodes As List(Of cls_TreeNode_Exp)

    childNodes = (From node As cls_TreeNode_Exp In inNodes
                  Where node.DR("ID_parent") = inParentNode.DR("ID")
                  Select node).ToList

    For Each node As cls_TreeNode_Exp In childNodes
        inNodes.Remove(node)
        inParentNode.Nodes.Add(node)

        Me.getChildNodes(inNodes, node)
    Next
End Sub

根据表的不同,migth最多可达10000个结果,最终会添加节点。每个节点都通过字段" DR"将相应的数据行连接到它。如果不进行重大重构,我怎样才能加快速度呢?

1 个答案:

答案 0 :(得分:0)

预先填充树视图可能是一项非常漫长的任务......特别是如果树节点有一些深度。

更好的方法是随时动态填充。

仅填充根级别,并在每个节点上添加一个适当标识的虚拟子节点(如果该节点具有子节点)。 然后使用节点上的before expand事件按需填充子项,使用相同的方法为任何后续子项放置标记。记得要删除虚拟孩子。

它为打开尚未填充的节点增加了一点开销,但如果该节点不包含1,000个子节点,则不应该是一个显着的延迟。如果确实如此......树视图可能不是正确使用的控件。

提示:您可以使用nodes标签属性来帮助简化展开事件...例如,您可以让它包含运行以填充节点所需的SQL查询。

另请注意:更新此类控件时,请始终使用暂停和恢复布局属性。