2016-08-10 13 views
0

カスタムTreeViewコントロールでいくつかの最終的な最適化を行うだけで、ロードメソッドをさらに最適化できるようです。ここでは、すべてのTreeNodeを最初に構築し、次にTreeView.AddRange(nodes[])メソッドを使用して最適化できると考えているセグメントを示します。次のコードを改良して結果が単一の `TreeView.AddRange() 'になるようにするには

// Create hierarchy and load into view 
foreach (var id in _treeNodes.Keys) 
{ 
    var node = GetNode(id); 
    var obj = (T)node.Tag; 
    var parentId = getParentId(obj); 

    if (parentId.HasValue) 
    { 
     var parentNode = GetNode(parentId.Value); 
     if(parentNode == null) 
     { 
      Invoke((MethodInvoker)(() => Nodes.Add(node))); 

     } else 
     { 
      Invoke((MethodInvoker)(() => parentNode.Nodes.Add(node))); 
     } 
    } 
    else 
    { 
     Invoke((MethodInvoker)(() => Nodes.Add(node))); 
    } 
} 

_treeNodesDictionary<ulong, TreeNode>

GetNode()です:

if(_treeNodes.ContainsKey(id)) 
{ 
    return _treeNodes[id]; 
} else 
{ 
    return null; 
} 

getParentId()は、コードは、現在すべてのディレクトリである辞書のリストからすべての値を取得しますFunc<NtfsUsnJournal.UsnEntry, ulong?> getParentId = (x => x.ParentFileReferenceNumber)

デリゲートです非常に速く起こるNTFSジャーナル。遅延は各Nodeと子ノードで、TreeViewに直接追加されます。私がやりたい何

、(当然のすべての子ノードを含む)ルートノードのリストを作成して、単一Invoke().AddRange(TreeNode[])方法にTreeNode[]の配列としてそれを渡すことです。

これを行うにはどのようにこのコードを変更できますか?

答えて

0

は、答えは私の顔を見つめた、それを考え出した:

List<TreeNode> _t = new List<TreeNode>(); 
foreach (var id in _treeNodes.Keys) 
{ 
    var node = GetNode(id); 
    var obj = (T)node.Tag; 
    var parentId = getParentId(obj); 

    if (parentId.HasValue) 
    { 
     var parentNode = GetNode(parentId.Value); 
     if(parentNode == null) 
     { 
      _t.Add(node); 
     } else 
     { 
      parentNode.Nodes.Add(node); 
     } 
    } 
    else 
    { 
     _t.Add(node); 
    } 
} 
Invoke((MethodInvoker)(() => Nodes.AddRange(_t.ToArray()))); 
関連する問題