Entwickler-Ecke
WinForms - treeView - Childnodes nicht aufklappbar
DerKleineImp - Mi 30.03.11 10:32
Titel: treeView - Childnodes nicht aufklappbar
Hallöchen
Nachdem ich gester den alben Tag Google malträtiert habe, habe ich endlich einen treevIew, der halbwegs funktioniert. Aber eben nur halbwegs.
Der Code ist folgender:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| private void AllSubDirectories(TreeNode node) { DirectoryInfo[] directories; DirectoryInfo info = new DirectoryInfo(node.FullPath); try { directories = info.GetDirectories(); } catch { return; } foreach (DirectoryInfo info2 in directories) { node.Nodes.Add(info2.Name); } }
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) { foreach (TreeNode node in e.Node.Nodes) { this.AllSubDirectories(node); } }
private void treeView1_AfterCollapse(object sender, TreeViewEventArgs e) { foreach (TreeNode node in e.Node.Nodes) { node.Nodes.Clear(); } } |
Der treeView soll alle Laufwerke und Verzeichnisse, aber keine Dateien, anzeigen. Aus Performancegründen soll nicht auf einen Schlag alles geladen werden sondern nur dann, wenn ein Node aufgeklappt wird. Die Laufwerke werden mir korrekt angezeigt, aber wenn man z.B. Laufwerk C aufklappt, haben die Ordner kein [+]. Ich denke der Grund ist, weil ich nur eine Ebene nach unten suche. Stimmt das? Aber wo genau muss ich den Code jetzt dafür anpassen? Kein Code, aber ein Stoß in die richtige Richtung wäre nett.
Eine andere Sache ist, dass das ganze noch nicht ok ausschaut. Der oberste Knoten soll Desktop sein, darunter als ein Knoten der Arbeitsplatz, und in diesem dann erst die Laufwerke. Im Grunde also wie im Windows Explorer. Wie spreche ich den z.B. den Arbeitsplatz an?
Das ganze verwirrt mich noch arg. Google hat mir wirklich nicht geholfen, bzw haben die Codebeispiele, die ich fand, nicht wirklich eingeleuchtet. Gehe ich das ganze aus der falschen Richtung an?
Liebe Grüße,
Der Imp
Edit: Der alte Threadname war mir dann doch zu doof. :)
Edit2: Das mit dem Desktop hat sich erledigt. Bin auf "Environment.GetFolderPath(Environment.SpecialFolder.Desktop)" gestoßen. :)
Christian S. - Mi 30.03.11 19:30
Hallo!
Ja, das Problem dürfte tatsächlich sein, dass Du nur eine Ebene nach unten suchst.
Ich würde das so lösen, dass Du beim erstmaligen Füllen des Treeview zwei Ebenen weit suchst (dann sollten alle "+" da sein, die man fürs weitere Vorgehen braucht) und dann bei jedem Ausklappen eines Nodes nicht diesen mit Childnodes befüllst (die sind ja schon da), sondern alle seine Childnodes mit Child-Childnodes befüllst.
Alternativ fügst Du einen Dummy-Childnode, z.B. " ... bitte warten ..." ein, der angezeigt wird, wenn die richtigen Childnodes noch nicht vorhanden sind. Dann hast Du das "+" und es wird während der Verzeichnissuche ein Statustext angezeigt.
Grüße
Christian
DerKleineImp - Mi 30.03.11 20:06
Hallöchen Christian
| Zitat: |
| Ich würde das so lösen, dass Du beim erstmaligen Füllen des Treeview zwei Ebenen weit suchst (dann sollten alle "+" da sein, die man fürs weitere Vorgehen braucht) und dann bei jedem Ausklappen eines Nodes nicht diesen mit Childnodes befüllst (die sind ja schon da), sondern alle seine Childnodes mit Child-Childnodes befüllst. |
Das klingt gut. Ich wühle mich da mal durch den Code. Ich melde mich dann demnächst mit oder (hoffentlich nicht) ohne Erfolgsmeldung zurück.
Die Frage mit Desktop und Arbeitsplatz hatte sich geklärt. Nur steht da, beim Desktop zum Beispiel, der volle Pfad. Node.name scheint da nicht zu helfen. Muss ich mich nochmal schlau machen. Aber es geht vorran.
Danke derweil für deine Hilfestellung.
LG
DerKleineImp - Fr 01.04.11 17:10
Tut mir leid, aber ich muss nochmal eure Hilfe in Anspruch nehmen.
Meine Form1.Load
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| private void Form1_Load(object sender, EventArgs e) { TreeNode Desktop = this.treeView1.Nodes.Add(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)); Desktop.Name = "Desktop"; this.AllSubDirectories(Desktop); foreach (string str in Directory.GetLogicalDrives()) { TreeNode node = this.treeView1.Nodes.Add(str); this.AllSubDirectories(node); } } |
Ich füge den desktop und alle Laufwerke als Nodes hinzu. Das ist soweit auch ok, aber der Desktopnode zeigt den kompletten Pfad. Also "C:\blahblub\usw".
Desktop.Name="Desktop" scheint keinen Effekt zu haben. Was mache ich wieder falsch? Die Methode AllSubDirectories habe ich weiter oben gepostet und ist derzeit noch unverändert.
LG
Kha - Sa 02.04.11 11:12
Wie kommst du denn auf Name? Die Hilfe sollte dich eigentlich auf Text verweisen, außerdem würde ich die Anweisung dann eine Zeile nach unten verschieben ;) .
DerKleineImp - Sa 02.04.11 19:18
Ohooo... Ja, ich mache mir heute wieder Freunde.
Ich habe mir nicht nur die falsche Eigenschaft aus wenigen Möglichen ausgesucht, sondern diese dann auch an falscher Stelle verwendet.
Kann ich mich da jetzt noch sauber rausreden? Schlechten Tag gehabt oder so? Nein, dachte ich auch nicht.
Hat jedenfalls, natürlich wie zu erwarten, gepasst.
Danke, Kha.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!