Ergebnis 1 bis 14 von 14

C#-Problem

  1. #1 Zitieren
    Provinzheld
    Registriert seit
    May 2012
    Beiträge
    220
    Hi,

    ich arbeite im Moment an einem kleinen Projekt in C#, genauer gesagt an einem Explorer (so ähnlich wie der Total Commander falls ihn wer kennt).

    Das hier listet die Verzeichnisse auf:

    Code:
    private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo)
            {  
                TreeNode aNode;
                
                foreach (DirectoryInfo subDir in subDirs)
                {
                    //MessageBox.Show(subDir.ToString());
                    if (! leftSideView.Nodes.ContainsKey(subDir.Name))
                    {
                        aNode = new TreeNode(subDir.Name, 0, 0);                    
                        aNode.Tag = subDir;
                        aNode.ImageKey = "folder";
                        nodeToAddTo.Nodes.Add(aNode);
                    }
                    else
                    {
                        leftSideView.SelectedNode.Nodes.RemoveByKey(subDir.Name);                   
                    }                
                }
            }
    Die Parameter, die übergeben werden sind der markierte Knoten im Treeview, bzw die Unterverzeichnisse des Knotens, leftSideView ist ein Treeview.

    Der Aufruf:

    Code:
    private void leftSideView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                TreeNode newSelected = e.Node;
                DirectoryInfo nodeInfo = new DirectoryInfo(leftSideView.SelectedNode.FullPath);
                
                    try
                    {
                         //Unterordner anzeigen                    
                          GetDirectories(nodeInfo.GetDirectories(), newSelected);
                    }
    
                    catch
                    {
                        MessageBox.Show("Zugriff verweigert");
                        newSelected.BackColor = Color.Red;                    
                    }
    
                    //Knoten öffnen
                    leftSideView.SelectedNode.Expand();
                              
            }

    Das Problem ist, dass er die If-Abfrage mit dem ContainsKey anscheinend ignoriert, denn er spring mir wieder und immer wieder in die Funktion rein und vervielfacht so die Einträge mit jedem Doppelklick auf den Knoten. Benutz ich das ContainsKey hier einfach nur falsch oder an was liegt es?

    Ich hoffe jemand kann mir da ein wenig auf die Sprünge helfen und danke im voraus.

    Serya
    Serya ist offline Geändert von Serya (22.05.2013 um 06:45 Uhr)

  2. #2 Zitieren
    Auserwählter
    Registriert seit
    Feb 2008
    Ort
    Heidelberg
    Beiträge
    6.952
    Ja ich glaube du nutzt da ContainsKey falsch.
    Laut Dokumentation entspricht der Key der "Name" Eigenschaft einer TreeNode/TreeNodeCollection Instanz. => Dem Kram der nachher im Tree View steht.

    Was ein DirectoryInfo dort zu suchen hat verstehe ich noch nicht ganz (macht auch kein sinn; die TreeNodeCollection des TreeViews enthält ja auch kein Verzeichnis; ganz zu schweigen der ToString() Methode); kannst du die Funktion des ganzen näher erläutern?
    aleator ist offline Geändert von aleator (21.05.2013 um 23:55 Uhr)

  3. #3 Zitieren
    Provinzheld
    Registriert seit
    May 2012
    Beiträge
    220
    Hi,

    tut mir leid, in Codeerklärungen und Problemschilderungen war ich schon immer ne Niete . Das mit dem "Name" hab ich wohl irgendwie überlesen, als ich über den Befehl gestolpert bin, hab es jetzt geändert, aber funktioniert immernoch net. Ich editier in den Anfangspost dann mal das Aktuelle und den Aufruf rein, evtl. bringt der auch ein bisschen Licht ins Dunkle.

    Ich probiers nochmal bissl ausführlicher zu erklären:

    Durch nen Doppelklick auf einen Knoten im Treeview wird diese Funktion aufgerufen. Die Verzeichnisse erhalte ich beim Aufruf, da ich hier den Pfad des geklickten Knotens auslese und dann mit "GetDirectories()" die Verzeichnisse erhalte, da für diese Funktion ja ein Pfad benötigt wird. Und das Ergebnis von "GetDirectories()" übergebe ich der Funktion als Parameter, sowie den angeklickten Knoten, damit die Verzeichnisse richtig untergeordnet werden. In der Foreach-Schleife wird dann für jedes Unterverzeichnis ein neuer Knoten erstellt.

    Hoffe es ist nun ein bisschen klarer.

    Serya
    Serya ist offline

  4. #4 Zitieren
    Auserwählter
    Registriert seit
    Feb 2008
    Ort
    Heidelberg
    Beiträge
    6.952
    Zitat Zitat von Serya Beitrag anzeigen
    Hi,

    tut mir leid, in Codeerklärungen und Problemschilderungen war ich schon immer ne Niete . Das mit dem "Name" hab ich wohl irgendwie überlesen, als ich über den Befehl gestolpert bin, hab es jetzt geändert, aber funktioniert immernoch net. Ich editier in den Anfangspost dann mal das Aktuelle und den Aufruf rein, evtl. bringt der auch ein bisschen Licht ins Dunkle.

    Ich probiers nochmal bissl ausführlicher zu erklären:

    Durch nen Doppelklick auf einen Knoten im Treeview wird diese Funktion aufgerufen. Die Verzeichnisse erhalte ich beim Aufruf, da ich hier den Pfad des geklickten Knotens auslese und dann mit "GetDirectories()" die Verzeichnisse erhalte, da für diese Funktion ja ein Pfad benötigt wird. Und das Ergebnis von "GetDirectories()" übergebe ich der Funktion als Parameter, sowie den angeklickten Knoten, damit die Verzeichnisse richtig untergeordnet werden. In der Foreach-Schleife wird dann für jedes Unterverzeichnis ein neuer Knoten erstellt.

    Hoffe es ist nun ein bisschen klarer.

    Serya
    Muss es nicht
    Code:
    leftSideView.SelectedNode.Nodes.ContainsKey(subDir.Name)
    heißen? Du willst ja wissen ob der Name bzw Key in dem aktuellen Node schon vorhanden ist und nicht auf der obersten Ebene?

    Du solltest allerdings auch
    Code:
    nodeToAddTo.Nodes.ContainsKey(subDir.Name)
    schreiben können...


    Ansonsten: Sind die Names der Nodes auch richtig formatiert?
    Bei
    Code:
    DirectoryInfo nodeInfo = new DirectoryInfo(leftSideView.SelectedNode.FullPath);
    muss ja ein korrekter Pfad herauskommen...
    aleator ist offline Geändert von aleator (22.05.2013 um 13:15 Uhr)

  5. #5 Zitieren
    Provinzheld
    Registriert seit
    May 2012
    Beiträge
    220
    Hi,

    du hast recht, hätte ich auch drauf kommen können mit dem
    Code:
    leftSideView.SelectedNode.Nodes.ContainsKey(subDir.Name)
    und
    Code:
    nodeToAddTo.Nodes.ContainsKey(subDir.Name)
    Allerdings funktioniert es immernoch net, aber was positiv is es stürzt immerhin net ab .

    Ansonsten: Sind die Names der Nodes auch richtig formatiert?
    Bei
    Code:
    DirectoryInfo nodeInfo = new DirectoryInfo(leftSideView.SelectedNode.FullPath);
    muss ja ein korrekter Pfad herauskommen...
    Das einzige was beim Pfad seltsam ist, ist, dass er nach dem Laufwerkbuchstaben ein Doppelslash hat, aber danach alles andre mit einem einzelnen Slash ist z.B. c:\\Users\Public\...
    Wenn der Pfad aber nicht stimmen würde, dann würde er aber nicht die Verzeichnisse auslesen, sondern einen Fehler bringen, dass er das Verzeichnis nicht finden kann. Und inwiefern soll man den Namen formatieren?

    Serya
    Serya ist offline

  6. #6 Zitieren
    Auserwählter
    Registriert seit
    Feb 2008
    Ort
    Heidelberg
    Beiträge
    6.952
    Zitat Zitat von Serya Beitrag anzeigen
    Hi,

    du hast recht, hätte ich auch drauf kommen können mit dem
    Code:
    leftSideView.SelectedNode.Nodes.ContainsKey(subDir.Name)
    und
    Code:
    nodeToAddTo.Nodes.ContainsKey(subDir.Name)
    Allerdings funktioniert es immernoch net, aber was positiv is es stürzt immerhin net ab .
    Uff, was für ne Sisyphusarbeit.

    Schau mal im Debugger was bei der ContainsKey Methode im "Name" der subDir bzw subDirs steht. Wenn der Fehler weiterhin besteht und er immer mehr Nodes hinzufügt scheint die Methode ja immer false zu liefern.

    Zitat Zitat von Serya Beitrag anzeigen
    Das einzige was beim Pfad seltsam ist, ist, dass er nach dem Laufwerkbuchstaben ein Doppelslash hat, aber danach alles andre mit einem einzelnen Slash ist z.B. c:\\Users\Public\...
    Wenn der Pfad aber nicht stimmen würde, dann würde er aber nicht die Verzeichnisse auslesen, sondern einen Fehler bringen, dass er das Verzeichnis nicht finden kann. Und inwiefern soll man den Namen formatieren?

    Serya
    Ka. Hab selbst noch nicht so viel mit Verzeichnissen gemacht.

    Laut Dokumentation:
    Beispielsweise sind alle folgenden Pfade zulässig:
    • "c:\\MyDir\\MyFile.txt" in C# oder "c:\MyDir\MyFile.txt" in Visual Basic.
    • "c:\\MyDir" in C# oder "c:\MyDir" in Visual Basic.
    • "MyDir\\MySubdir" in C# oder "MyDir\MySubDir" in Visual Basic.
    • "\\\\MyServer\\MyShare" in C# oder "\\MyServer\MyShare" in Visual Basic.
    Der Doppelslash ist ja klar, normalerweise liefert .FullPath ja sowas wie zB:
    Code:
    Erde\Europa\Deutschland\Berlin\Kreuzberg
    Wenn das erste Element "C:\" heißt gibt das ein Doppelslash.
    aleator ist offline

  7. #7 Zitieren
    Provinzheld
    Registriert seit
    May 2012
    Beiträge
    220
    Hi,

    Uff, was für ne Sisyphusarbeit.
    Ohne Herausforderungen wärs Leben doch langweilig

    Im "Name" steht immer der Verzeichnisname drin, so wie er auch im Treeview steht und alle andren Variablen haben auch nen Wert, bis auf den "aNode" steht nirgends ein "null" drin (was bei dem ja logisch is, da er ja erst neu erstellt wird).

    Hab die Abfrage mit

    Code:
    MessageBox.Show(nodeToAddTo.Nodes.ContainsKey(subDir.Name).ToString();
    quasi ausgegeben und er liefert wirklich IMMER ein "false" zurück. Das kann doch aber eigentlich nicht sein, da ja der Name schon vorhanden ist.

    Serya

    Edit: hab grad versucht mit dem normalen "contains" zu prüfen, ob der Knoten schon da is, aber da kommt auch nur "false" zurück.
    Serya ist offline Geändert von Serya (23.05.2013 um 17:37 Uhr)

  8. #8 Zitieren
    Auserwählter
    Registriert seit
    Feb 2008
    Ort
    Heidelberg
    Beiträge
    6.952
    Zitat Zitat von Serya Beitrag anzeigen
    Hi,



    Ohne Herausforderungen wärs Leben doch langweilig

    Im "Name" steht immer der Verzeichnisname drin, so wie er auch im Treeview steht und alle andren Variablen haben auch nen Wert, bis auf den "aNode" steht nirgends ein "null" drin (was bei dem ja logisch is, da er ja erst neu erstellt wird).

    Hab die Abfrage mit

    Code:
    MessageBox.Show(nodeToAddTo.Nodes.ContainsKey(subDir.Name).ToString();
    quasi ausgegeben und er liefert wirklich IMMER ein "false" zurück. Das kann doch aber eigentlich nicht sein, da ja der Name schon vorhanden ist.

    Serya

    Edit: hab grad versucht mit dem normalen "contains" zu prüfen, ob der Knoten schon da is, aber da kommt auch nur "false" zurück.
    Hast du's inzwischen hinbekommen?

    Wenn
    Code:
    subDir.Name
    exakt das gleiche liefert was auch im Node steht bin ich überfordert.

    Alternativ könntest du mir mal den gesamten Code schicken...
    aleator ist offline

  9. #9 Zitieren
    Provinzheld
    Registriert seit
    May 2012
    Beiträge
    220
    Hi,

    leider nicht, experimentier auch grade mit der normalen For-Schleife, aber läuft net besser . Ich schick dir mal den ganzen Code evtl hat sich ja irgendwo was versteckt wo ichs net vermute und sehe.

    Serya
    Serya ist offline

  10. #10 Zitieren
    Auserwählter
    Registriert seit
    Feb 2008
    Ort
    Heidelberg
    Beiträge
    6.952
    Zitat Zitat von Serya Beitrag anzeigen
    Hi,

    leider nicht, experimentier auch grade mit der normalen For-Schleife, aber läuft net besser . Ich schick dir mal den ganzen Code evtl hat sich ja irgendwo was versteckt wo ichs net vermute und sehe.

    Serya
    Funktioniert der Code bei dir? Wenn ich ein TreeView anklicke stürzt er mit einer exception ab.
    aleator ist offline

  11. #11 Zitieren
    Provinzheld
    Registriert seit
    May 2012
    Beiträge
    220
    Hi,

    geht leider nicht, da die Knoten noch nicht da sind, wenn ich prüfe. Das sollte doch dann eigentlich der Auslöser für den else-Block sein, oder? Habs mal mit nem try/catch -Block probiert, aber dann schmiert er im catch ab.

    Serya
    Serya ist offline

  12. #12 Zitieren
    Auserwählter
    Registriert seit
    Feb 2008
    Ort
    Heidelberg
    Beiträge
    6.952
    Zitat Zitat von Serya Beitrag anzeigen
    Hi,

    geht leider nicht, da die Knoten noch nicht da sind, wenn ich prüfe. Das sollte doch dann eigentlich der Auslöser für den else-Block sein, oder? Habs mal mit nem try/catch -Block probiert, aber dann schmiert er im catch ab.

    Serya
    Der Auslöser ist das casten außerhalb des try Blocks...


    Ich habe den Fehler gefunden:

    Code:
            private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo)
            {
                TreeNode aNode;
                foreach(DirectoryInfo subDir in subDirs)
                {
                    if (!nodeToAddTo.Nodes.ContainsKey(subDir.Name))
                    {
                        aNode = new TreeNode(subDir.Name, 0, 0);
                        aNode.Tag = subDir;
                        aNode.Name = subDir.Name;
                        aNode.ImageKey = "folder";
                        nodeToAddTo.Nodes.Add(aNode);
                    }
                }
            }
    Du musst nochmal explizit
    Code:
    aNode.Name = subDir.Name;
    schreiben.

    ContainesKey überprüft die "Name" Eigenschaft. Der Konstruktor von TreeNode setzt aber nur die Eigenschaft "Text"

    EDIT:

    Und das Problem mit dem cast ist auch gelöst:
    Code:
    aNode.Tag = subDir;
    Du hast aNode.Tag erst subDir.Name (also ein String) zugewiesen.
    Das ergibt einen Fehler wenn du diesen String in ein DirectoryInfo umwandeln willst...

    Also bei mir funktioniert jetzt alles.


    EDIT2:
    Es gibt aber noch ein Problem:
    Wenn ich zB im TreeView C:\ auswähle und mit einem Doppelklick den Ast von E:\ öffne werden die Verzeichnisse von C:\ dem Laufwerk E:\ zugeordnet; das bekommst du aber denke ich mal selber hin...
    aleator ist offline Geändert von aleator (29.05.2013 um 21:06 Uhr)

  13. #13 Zitieren
    Provinzheld
    Registriert seit
    May 2012
    Beiträge
    220
    Hi,

    manchmal sieht man echt den Wald vor lauter Bäumen net . Dabei isses sogar logisch warums net ging .
    Nur die Sache mit den vertauschten Verzeichnissen kann ich bei mir net nachvollziehen. Habs so gemacht wie dus beschrieben hast, aber geht problemlos. Naja net bechweren drüber, dasses funktioniert .

    Vielen Dank. Wenn ich gläubig wär würd ich dich dafür in mein Abendgebet einschließen .

    Serya
    Serya ist offline

  14. #14 Zitieren
    Auserwählter
    Registriert seit
    Feb 2008
    Ort
    Heidelberg
    Beiträge
    6.952
    Zitat Zitat von Serya Beitrag anzeigen
    Hi,

    manchmal sieht man echt den Wald vor lauter Bäumen net . Dabei isses sogar logisch warums net ging .
    Nur die Sache mit den vertauschten Verzeichnissen kann ich bei mir net nachvollziehen. Habs so gemacht wie dus beschrieben hast, aber geht problemlos. Naja net bechweren drüber, dasses funktioniert .

    Vielen Dank. Wenn ich gläubig wär würd ich dich dafür in mein Abendgebet einschließen .

    Serya


    Wenn du C:\ makierst und zB auf das plus von E:\ doppelklickst bleibt C:\ weiterhin makiert.

    Liegt daran, dass e.Nodes und leftsideview.SelectedNode (hie0 das so, habe den Code gerade nicht zur verfügung) zwei unterschiedliche Dinge liefern. Das solltest du noch ändern...
    aleator ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •