【问题标题】:How to optimize loading data into a treeview如何优化将数据加载到树视图中
【发布时间】:2017-01-30 15:46:23
【问题描述】:

我想优化 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

根据表的不同,可能会有多达 10000 个结果最终被添加节点。每个节点都有通过字段“DR”附加到它的相应数据行。如何在不进行重大重构的情况下加快速度?

【问题讨论】:

  • 进程慢吗?您是否正在计时它的特定部分以找出哪个代码块是慢速部分?
  • 只要节点在 setTreenodeCollection 中的列表“节点”获得大量条目,它通常会变得非常慢。但 imo 是确定子节点的过程才是问题的核心。
  • 如果您正在加载节点,为什么还要删除它们?
  • 如果满足条件,他们将从父母列表中删除并添加到孩子列表中。这不是我自己的代码,它取自一些客户仍在使用的旧应用程序,因为它是开发人员,几乎没有文档,我必须以某种方式解决这个问题。当某些表的行数增长并且现在应用程序无法正常使用时,此问题开始出现。

标签: .net vb.net winforms treeview


【解决方案1】:

预先填充树视图可能是一项非常漫长的任务……尤其是在树节点有一定深度的情况下。

一个更好的方法是动态填充你去。

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

打开尚未填充的节点会增加一点开销,但如果该节点不包含 1,000 个子节点,则应该不会有很大的延迟。如果是这样.. 树视图可能不是要使用的正确控件。

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

另外:更新此类控件时,请始终使用挂起和恢复布局属性。

【讨论】:

    猜你喜欢
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多