StackflowとC#newbie here!Treeviewへの文字列のリストの読み込みを高速化
私はいくつかのコードをツリービューコントロールに文字列のリストをロードし、それはうまく動作します。唯一の問題は速度です。リストが大きい場合、ロードに時間がかかりますが、UIをしばらくロックする以外は問題ありません。
C:\ DRIVERS \ test1.txtという
C:\ DRIVERS \ test2.txtという名前
C:
だから例は、このような文字列のリスト(しかし、はるかに大きい)だろう\ドライバ\フォルダ\ test1.txtという
C:\兄弟\テスター\ text1.zip
C:\弟\別の\ text2.zip
C:\データ\のCompany1のの\
C accounts.rar:\データ\のCompany2の\ accounts.rar
treeviewは、文字列をバックスラッシュマーカーで分割し、エクスプローラビューにきれいに配置します。これはいいです!
tvRestoreは、例のTreeviewコントロールです。
foreach (string path in lstKeys)
{
lastNode = null;
subPathAgg = string.Empty;
foreach (string subPath in path.Split(new string[] { "\\" }, StringSplitOptions.None))
{
foreach (string item in subPath.Split(new string[] { "\\" }, StringSplitOptions.None))
{
if (item == "" || item == null)
{
continue;
}
subPathAgg += item + "\\";
TreeNode[] n = tvRestore.Nodes.Find(subPathAgg, true);
if (n.Length > 0)
{
lastNode = n[0];
continue;
}
else
{
// lastNode = null;
}
TreeNode[] nodes = tvRestore.Nodes.Find(subPathAgg, true);
if (nodes.Length == 0)
if (lastNode == null)
lastNode = tvRestore.Nodes.Add(subPathAgg, item);
else
lastNode = lastNode.Nodes.Add(subPathAgg, item);
else
lastNode = nodes[0];
}
}
}
唯一の問題は速度です。コントロールが別のスレッドにあるため、スレッド例外を使用しようとしましたが、コード例外が発生しました。私はNodes.Addを呼び出す必要があると信じていますが、これを行う方法を理解することはできません。
理想的には、アプリケーションが起動したときにツリービューが表示されるようになりますが、大きなリストの場合は30〜40秒以上ロックアップしたくないという理想があります。
この処理を高速化する最も良い方法は何ですか?
'treeView1.BeginUpdate();でノードを追加する前に描画をオフにしてから、' EndUpdate();で再び有効にしてください。 – LarsTech