2017-01-30 3 views
0

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」を介して接続されている。どうすれば大きなリファクタリングをせずにこれをスピードアップできますか?

+0

プロセスが遅いですか?どのコードブロックが遅い部分であるかを見つけるために、その特定の部分をタイミングしていますか? – LarsTech

+0

ノードがリストを持つとすぐに、setTreenodeCollectionのノードは大量のエントリを取得しますが、一般的には非常に遅くなります。しかし、それは問題の中核である子ノードを決定する手続きです。 – TheLax

+0

ノードをロードしている場合は、そのノードもなぜ削除していますか? – LarsTech

答えて

0

ツリービューを前面に配置することは、非常に長い作業になる可能性があります。特に、ツリーノードに深さがある場合は特にそうです。

より良い方法は、移動しながら動的にデータを取り込むことです。

ルートレベルのみを設定し、そのノードに子がある場合は、適切に識別された単一のダミー子を各ノードに追加します。 ノード上で展開前のイベントを使用して、同じ方法で次の子にマーカーを配置してオンデマンドで子を移入します。ダミーの子を削除することを覚えています。

まだ実装されていないノードを開くために少しオーバーヘッドが追加されますが、そのノードに1,000sの子が含まれていない場合は、それほど大きな遅延はありません。もしそうならツリービューはおそらく使用する正しいコントロールではないでしょう。

ヒント:nodesタグプロパティを使用すると、展開イベントを簡素化することができます。たとえば、ノードに入力するために実行する必要がある必須のSQLクエリが含まれている可能性があります。

ALSO:このようなコントロールを更新するときは、常にサスペンドとレジュームのレイアウトプロパティを使用してください。

関連する問題