カスタム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)));
}
}
_treeNodes
Dictionary<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[]
の配列としてそれを渡すことです。
これを行うにはどのようにこのコードを変更できますか?