2017-01-30 2 views
0

Я хочу оптимизировать время загрузки нескольких древовидных изображений в приложении VB.NET. Структура каждого дерева рассматривается на основе таблицы базы данных, информация которой представлена ​​набором данных. Каждая таблица имеет идентификатор и Parent_ID, что означает, что каждая таблица содержит иерархическую структуру. По этой причине необходимо заполнить каждое дерево, используя код, который помогает создать правильную структуру.Как оптимизировать загрузку данных в treeview

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 результатов, которые в конечном итоге добавляют узлы. Каждый узел имеет соответствующий datarow, прикрепленный к нему через поле «DR». Как я могу ускорить это, не делая большой рефакторинг?

+0

Является ли процесс медленным? Вы определяете определенные части его, чтобы узнать, какой блок кода является медленной частью? – LarsTech

+0

Как только узлы имеют список «узлы» в setTreenodeCollection, получается большое количество записей, в целом оно становится очень медленным. Но imo - это процедура, которая определяет дочерние элементы, являющиеся ядром проблемы. – TheLax

+0

Если вы загружаете узлы, почему вы их тоже удаляете? – LarsTech

ответ

0

Заполнение древовидной структуры спереди может быть ОЧЕНЬ длинной задачей ... особенно если есть некоторая глубина для узлов дерева.

Лучшим методом является динамическое заполнение, когда вы идете.

Заполните только уровень корня и добавьте один, соответствующий идентифицированный фиктивный дочерний элемент для каждого узла, если у этого узла есть дети. Затем используйте событие before expand на узле, чтобы заполнить детей по требованию, используя тот же метод, чтобы помещать маркеры для любых последующих детей. Помните, что нужно удалить фиктивного ребенка.

Он добавляет немного накладных расходов, чтобы открыть узлы, которые вы еще не заселили, но если этот узел не содержит 1000 детей, это не должно быть значительной задержкой. Если это так, то treeview, вероятно, не является правильным элементом управления.

Совет. Вы можете использовать свойство тегов узлов, чтобы упростить событие разворота ... Например, вы могли бы иметь в нем требуемый SQL-запрос, который нужно выполнить для заполнения узла.

ТАКЖЕ: Всегда используйте свойства приостановки и возобновления макета при обновлении таких элементов управления.

Смежные вопросы