Problem mit TreeView-Abfrage nach Verzeichnissen



  • Hallo,

    ich habe folgendes Problem:

    Ich habe mir ein Treeview-Objekt gebastelt, welches sich aus einem virtuellem Abbild meiner Systemverzeichnisstruktur zusammensetzt. Damit ich dabei nicht beim Programmstart, wenn der TreeView aufgebaut wird, unzählige Minuten warten muss, wird mein TreeView Objekt folgendermaßen gebaut:

    Zunächst lade ich LocalDrives (über getLogicalDrives()) inklusive der Childverzeichnisse der nächsten unteren Ebene und füttere damit den TreeView. Die ChildNodes dieser TreeNodes füttere ich mit "FakeNodes" (erzeugt mit dem Text "*").

    Dies habe ich gemacht, damit mir für den Fall, dass der Anwender die LogicalDrive-Nodes expandiert, im Vorwege eine Expandieroption für die SubNodes verfügbar wird. Sobald ich dann tiefergelegene Nodes expandiere werden die "FakeNodes" durch reale Nodes ersetzt. Dies funktioniert bereits zu meiner vollsten Zufriedenheit, auch in Hinsicht der Performance. Alle Nodes des TreeViews habe ich mit Checkboxen versehen, welche mit CheckBox.Checked = true vorbelegt sind.

    Der Anwender kann nun den Haken für beliebiege CheckBoxen entfernen. Über eine Schaltfläche werden dann alle systemseitigen Verzeichnisse durchsucht nach expliziten Vorgaben, wobei die Verzeichnisse, welche im Treeview ohne Haken sind, nicht mit durchsucht werden sollen.

    Beim Aktivieren der Schaltfläche durchlaufe ich alle systemseitigen Verzeichnisse rekursiv und frage ab, ob es dazu eine TreeNode gibt, die den State node.Checked = false hat:

    if (IsChecked(directory))
        ...
    

    Die Methode welche durchlaufen wird, führt nun zu einer merkwürdigen Problematik:

    private bool IsChecked (DirectoryInfo dir)
    {
        foreach(TreeNode node in treeview.Nodes)
        {
            if (node.FullPath == dir.Name)) //Fehlerzeitpunkt
            {
                if (node.Checked)
                    return true;
                return false;
            }         
        }
        //Wenn Node nicht vorhanden, dann auf jeden Fall durchsuchen
        return true;
    }
    

    Das Problem ist, dass dies außer für die TreeNodes, welche sich im treeview.Level = 0 befinden funktioniert, aber darunter nicht mehr, weil node.Fullpath für sämtliche ChildNodes doppelte Backslashes nach der RootNode des Levels 0 hat:

    DirectoryInfo: dir.Name == C:\\
    DirectoryInfo: dir.Name == C:\\Users\...\\Desktop

    aber:

    TreeNode: node.FullPath == C:\\
    TreeNode: node.FullPath == C:\\\Users\...\\Desktop

    Ich dachte, dass ich mal schlau bin und die Abfrage nach Substring über den TreeNode.FullPath druchführe, aber dort friemelt er mir dann trotzdessen Backslashes rein.

    Hat jemand eine Idee, wie ich das bewerkstelligen kann?



  • Die TreeView hat eine PathSeparator Eigenschaft, die beim Zusammenbauen vom FullPath verwendet wird. Schau sie dir mal an. Dann hast du wahrscheinlich auch noch in den Namen der Knoten Backslashes, sonst können die ja nirgends herkommen.



  • Vielen Dank. Tatsächlich war im Pathseperator ein Wert eingetragen, der zu dem Fehler führte. Der Fehler lag nur vielmehr daran, dass ich nicht wusste, dass dieser eine Auswirkung hatte.


Anmelden zum Antworten