![]() |
[C#] TreeView im Thread ändern?
Hallo ihr,
ich will in einem Thread ein Verzeichnis und dessen Unterverzeichnisse durchsuchen. Ich frage mich nun wie man das am besten erledigt:
Code:
Er erlaubt mir nämlich nicht auf TVTree zuzugreifen. Aber leider brauche ich den Tree, beziehungsweise den Rootnode, damit ich die Nodes füllen kann.
private void BWThread_DoWork(object sender, DoWorkEventArgs e)
{ TVTree.BeginUpdate(); try { TVTree.Nodes.Clear(); SearchPath(SelPath + "\\", "", TVTree.Nodes); } finally { TVTree.EndUpdate(); } } SearchPath sieht übrigens so aus:
Code:
MfG
private int SearchPath(string BasePath, string SubPath, TreeNodeCollection Root)
{ DirectoryInfo dir = new DirectoryInfo(BasePath + SubPath); int FileCnt = 0; foreach (DirectoryInfo SubDir in dir.GetDirectories()) { TreeNode tn = new TreeNode(SubDir.Name); tn.Checked = true; if (SearchPath(BasePath, SubPath + SubDir.Name + "\\", tn.Nodes) > 0) Root.Add(tn); } foreach (FileInfo DfmFile in dir.GetFiles("*.dfm")) { TreeNodePlus tn = new TreeNodePlus(DfmFile.Name); tn.Checked = true; DfmEntry entry = new DfmEntry(DfmFile.FullName); tn.Entry = entry; Root.Add(tn); FileCnt++; } return FileCnt; } xZise |
Re: [C#] TreeView im Thread ändern?
Brauchst du einen inkrementellen Aufbau des TreeViews? Wenn nein: Hänge die Root-Nodes einfach erst am Schluss im Hauptthread (WorkCompleted-Event) in den TreeView ein. Wenn ja, wirst du jeden Add-Aufruf in Control.BeginInvoke wrappen müssen.
PS: Parameter und lokale Variablen bitte klein schreiben. Und sieht nicht so aus, als ob du wirklich zwischen BasePath und SubPath trennen müsstest ;) . Bzw. wenn du schon mit DirectoryInfo arbeitest (würde auch mit den statischen Directory-Methoden gehen), übergebe die doch rekursiv. |
Re: [C#] TreeView im Thread ändern?
Ich drücke es mal so aus ;) Aufgrund des "Delphi oder C#" Threads bin ich wieder zu C# gestoßen (ich hatte mich KURZZEITIG) damit beschäftigt :D Deshalb verzeihe mir die etwas "krude" Groß/Kleinschreibung :)
Auch die Trennung zwischen Sub/Basepath ist inzwischen auch hinfällig. Und was meinst du damit, die DirectoryInfo zu übergeben? [edit]So jetzt habe ich mal SearchPath "verbessert" (ich hoffe es):
Code:
private int SearchPath(DirectoryInfo workingDir, TreeNodeCollection root)
{ int fileCnt = 0; foreach (DirectoryInfo subDir in workingDir.GetDirectories()) { TreeNode tn = new TreeNode(subDir.Name); tn.Checked = true; if (SearchPath(subDir, tn.Nodes) > 0) { root.Add(tn); fileCnt++; } } foreach (FileInfo DfmFile in workingDir.GetFiles("*.dfm")) { TreeNodePlus tn = new TreeNodePlus(DfmFile.Name); tn.Checked = true; tn.Entry = new DfmEntry(DfmFile.FullName); root.Add(tn); fileCnt++; } return fileCnt; }
Zum Eigentlichen Thema. Also ich habe das jetzt so (wahrscheinlich nicht gerade hübsch ^^ aber es geht erstmal) gelöst:
Code:
MfG
private void BWThread_DoWork(object sender, DoWorkEventArgs e)
{ TreeNode Root = new TreeNode(); SearchPath(SelPath + "\\", "", Root.Nodes); e.Result = Root; } private void BWThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { // Thread ist fertig: Ladebalken raus, Einträge eintragen :P TVTree.BeginUpdate(); try { TreeNode ThreadRoot = (TreeNode)e.Result; TVTree.Nodes.Clear(); foreach (TreeNode node in ThreadRoot.Nodes) { TVTree.Nodes.Add(node); } TVTree.Enabled = true; } finally { PLoading.Hide(); TVTree.EndUpdate(); } } xZise |
Re: [C#] TreeView im Thread ändern?
nja, du wie schon erwähnt, solltest du die Zugriffe vom Thread aus trheadsicher absichern, :nerd:
also wärend des Zugriffs den Hauptthread "sperren". ich mach es bei meinem SSF so, daß ich erstmal das ganze Verteichnis temporär einlese (und noch Einiges mehr), eine interne Liste erstelle und dann zum Schluß kurz die Threads sperre (aka Control.BeginInvoke) und alles zusammen (je ein ganzes Verzeichnis) in den Baum einfüge und dann wieder entsperre eine Auflistung via FindFirstFile/FindFirst dauert bei großen Verzeichnissen ja leider etwas und die Threads für jede Datei einzeln zu blocken fand ich etwas unökonomisch :stupid: |
Re: [C#] TreeView im Thread ändern?
Also mit dem Begin/EndUpdate ein Begin/EndInvoke ausführen? Aber was will er da als Parameter haben?
MfG xZise |
Re: [C#] TreeView im Thread ändern?
Zitat:
@himitsu: Exakt das macht sein Code ;) . Die Synchronisierung übernimmt der BackgroundWorker. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz