AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[C#] TreeView im Thread ändern?

Ein Thema von xZise · begonnen am 24. Aug 2009 · letzter Beitrag vom 24. Aug 2009
Antwort Antwort
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

[C#] TreeView im Thread ändern?

  Alt 24. Aug 2009, 17:45
Hallo ihr,
ich will in einem Thread ein Verzeichnis und dessen Unterverzeichnisse durchsuchen. Ich frage mich nun wie man das am besten erledigt:
Code:
private void BWThread_DoWork(object sender, DoWorkEventArgs e)
{
    TVTree.BeginUpdate();
    try
    {
        TVTree.Nodes.Clear();
        SearchPath(SelPath + "\\", "", TVTree.Nodes);
    }
    finally
    {
        TVTree.EndUpdate();
    }
}
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.

SearchPath sieht übrigens so aus:
Code:
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;
}
MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: [C#] TreeView im Thread ändern?

  Alt 24. Aug 2009, 18:58
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#3

Re: [C#] TreeView im Thread ändern?

  Alt 24. Aug 2009, 20:37
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 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;
}
  • Parameter & Variablen klein (okay DfmFile nicht fällt mir gerade auf)
  • Ein Bug behoben, dass Dateien in "tieferen" Ordnern, übersprungen wurden
  • Kein Pfad sondern ein DirectoryInfo Objekt (das ändert auch den Aufruf unten: SearchPath(new DirectoryInfo(SelPath + "\\"), Root.Nodes);)
[/edit]

Zum Eigentlichen Thema. Also ich habe das jetzt so (wahrscheinlich nicht gerade hübsch ^^ aber es geht erstmal) gelöst:
Code:
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();
    }
}
MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

Re: [C#] TreeView im Thread ändern?

  Alt 24. Aug 2009, 20:48
nja, du wie schon erwähnt, solltest du die Zugriffe vom Thread aus trheadsicher absichern,
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#5

Re: [C#] TreeView im Thread ändern?

  Alt 24. Aug 2009, 20:58
Also mit dem Begin/EndUpdate ein Begin/EndInvoke ausführen? Aber was will er da als Parameter haben?

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#6

Re: [C#] TreeView im Thread ändern?

  Alt 24. Aug 2009, 23:16
Zitat von xZise:
wahrscheinlich nicht gerade hübsch ^^
Doch, genau so habe ich es gemeint.

@himitsu: Exakt das macht sein Code . Die Synchronisierung übernimmt der BackgroundWorker.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz