Entwickler-Ecke
WinForms - Treeview: Textfile strukturiert anzeigen
SSC streezer - Di 03.06.08 13:29
Titel: Treeview: Textfile strukturiert anzeigen
Hallo leuts,
brauch wieder mal eure hile ;)
ich möchte ein text file einlesen mittels show.dialog() -> das klappt auch soweit.
dann soll das textfeld in einem treeview element dargestellt werden -> klappt auch schon.
des weiteren soll das ganze Textfile struktiert, also mit Nodes, angezeigt werden.
Beispiel:
-OfficeMain.Navigator
--OfficeMain.Navigator.OfficeMain
-Address.Adressmanagement
--Address.Adressmanagement.AdressenVerwaltung
---Address.Adressmanagement.AdressenVerwaltung.AdressenAuswahl
----Address.Adressmanagement.AdressenVerwaltung.AdressenAuswahl.cfldAdressNr
----Address.Adressmanagement.AdressenVerwaltung.AdressenAuswahl.clstSuchenIn
----Address.Adressmanagement.AdressenVerwaltung.AdressenAuswahl.cbtnContactPerson
----Address.Adressmanagement.AdressenVerwaltung.AdressenAuswahl.cfldCountryNo
----Address.Adressmanagement.AdressenVerwaltung.AdressenAuswahl.clstFilter
-Address.Adressmanagement.AdressenVerwaltung.AdressenAuswah2
vielen dank für eure tipps ;)
gruss,
streezer
Christian S. - Di 03.06.08 14:33
Hallo!
Ich würde die Datei zeilenweise durchgehen und zählen, wieviele Striche am Anfang der Zeile sind (z.B. mit einem Regex). Dabei würde ich mir auch noch die Anzahl der Striche von der vorhergehenden Zeile merken.
Dann gibt es drei Fälle:
Die Anzahl der Striche in der aktuellen Zeile ist ...
- ... dieselbe Anzahl wie in der vorigen. Dann wird die aktuelle Zeile zum selben Knoten hinzugefügt wie die vorhergehende.
- ... um eins größer (mehr als um eins geht ja nicht). Dann wird die aktuelle Zeile zu dem Knoten hinzugefügt, welcher der vorhergehenden Zeile entspricht.
- ... kleiner als die der vorhergehenden Zeile. Dann musst Du den Baum wieder hochwandern, um den richtigen Knoten zu finden. Waren in der vorherigen Zeile 5 Striche und in der jetzigen 2 Striche, dann musst Du den Baum wieder 3 Stufen hochwandern (über die Parent-Eigenschaft der knoten)
Als Stichworte wirst Du brauchen:
- TreeView.Nodes (insbesondere Add-Methode)
- TreeNode Klasse
- TreeNode.Parent
- TreeNode.LastNode
- TreeNode.Nodes (insbesondere Add-Methode)
Grüße
Christian
SSC streezer - Di 03.06.08 14:38
k- xD das problem ist die striche hab ich nur hingemacht damit man versteht was ich meine... im txt file gibt es diese nicht ;)
//edit: im moment mach ich das so:
Quelltext
1: 2: 3: 4: 5:
| while (reader.Peek() != -1) { sZeile = reader.ReadLine(); treeFile.Nodes.Add(sZeile); } |
-> also alles auf einen node...
bakachan - Di 03.06.08 14:52
Dann zählst du halt nicht die Striche am Anfang der Zeile sondern unterscheidest nach der Anzahl der Punkte im Text (falls es immer durch n Punkt getrennt ist) ansonsten könntest du auch über stringvergleiche mit vorherigen nodes erkennen welcher wo mit beinhaltet ist und somit parentnode ist
Christian S. - Di 03.06.08 14:55
Ohne die Striche ist der Code sogar noch einfacher!
Du hast den Knoten der Zeile, die Du zuletzt eingefügt hast. Von dem aus gehst Du immer weiter "nach oben" und schaust, ob Deine aktuelle Zeile mit dem Text eines der Parent-Knoten anfängt. Das ist dann auch Dein Parent-Knoten.
SSC streezer - Di 03.06.08 15:03
Christian S. hat folgendes geschrieben: |
Ohne die Striche ist der Code sogar noch einfacher!
Du hast den Knoten der Zeile, die Du zuletzt eingefügt hast. Von dem aus gehst Du immer weiter "nach oben" und schaust, ob Deine aktuelle Zeile mit dem Text eines der Parent-Knoten anfängt. Das ist dann auch Dein Parent-Knoten. |
hehe noch einfacher xD ok - vielen dank für die hinweise - werde die lösung hier posten wenn ichs hab...
greets aus der momentan noch sonnigen schweiz xD
streezer
Christian S. - Di 03.06.08 15:05
Kannst ja gerne fragen, wenn Du nicht weiter kommst :-)
SSC streezer - Di 03.06.08 15:27
also...
hab mich für die punktezähl-methode entschieden...
denke das ist die schnellste art - perfomancemässig...
hab jetzt aber echt keine ahnung wie ich das anstellen soll.
ich nehm mal an dass ich hier so etwas machen muss:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| while (reader.Peek() != -1) { sZeile = reader.ReadLine();
if(Bedingung){ treeFile.Nodes.Add(sZeile); } } |
aber wie ich die bedingung aufbauen soll -.- :S kein blassen..
Christian S. - Di 03.06.08 15:32
Nehme mein erstes Posting und ersetze das Wort "Strich" durch "Punkt" :D
bakachan - Di 03.06.08 15:34
Hmm mit Punkten ok...
Wenns mehr Punkte sind gehörts zum dem letzten node
wenns gleichviele sind is es ein eigenständiger node auf dieser ebene
wenns weniger sind musst du die entsprechende ebene raussuchen
Schwachstelle an der sache ist falls die Zeilen gemixt sind also nicht in der Richtigen Reihenfolge weil du dann nicht einfach nur nach den Punkten entscheiden kannst sondern die Strings vergleichen musst wie Christian es gesagt hat, allgemein wird es wohl sicherer sein zu überprüfen ob der vorherige String (oder auch andere) in der nächsten zeile enthalten sind und danach dann die nodes zu erstellen
SSC streezer - Di 03.06.08 15:46
also sortiert sind die dinger richtig... darum mache ich mir keine sorgen das hab ich schnell überprüft...
danke für den hinweis...
--------------------------------
das klappt nicht -.- kann ich keine bedingung machen während dem er die sachen in den treeview schreibt?
C#-Quelltext
1: 2: 3: 4: 5: 6:
| while (reader.Peek() != -1) { sZeile = reader.ReadLine(); string[] blabla = sZeile.Split(".".ToCharArray()); treeFile.Nodes.Add(sZeile); } |
mir ist durchaus bewusst dass die bedingung noch nicht zu meinem gewünschten ergebnis führt... ;)
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
SSC streezer - Mi 04.06.08 10:21
ich hab echt keine ahnung wie ich es schaffe :s
ich hab jetzt eine if bedingung gesetzt und dann reingeschrieben dass es ein neuer Node geben soll falls blabla nicht leer ist...
ich glaube ich hab da n logik fehler :s ich hab leider keine ahnung welchen... bin langsam am verzweifeln... :(
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| FileStream fs = new FileStream(fldg.FileName, FileMode.Open); StreamReader reader = new StreamReader(fs); string sZeile = "";
while (reader.Peek() != -1) { sZeile = reader.ReadLine();
string[] blabla = sZeile.Split(".".ToCharArray());
if (blabla != null) { TreeNode Parent = new TreeNode(); Parent.Nodes.Add(blabla); } } reader.Close(); fs.Close(); |
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
Christian S. - Mi 04.06.08 10:26
Ich sehe nicht mal ansatzweise, dass Du versuchst, umzusetzen, was Dir geschrieben wurde. Beispiel: Wo vergleichst Du die Anzahl der Punkt ein der aktuellen Zeile mit der Anzahl der Punkte der vorigen Zeile?
SSC streezer - Mi 04.06.08 10:42
also bei zeile 9 splitte ich die einzelnen zeilen bis ein . auftritt
ist dann ein vergleich noch nötig? :S sorry mache das noch nicht so lange wie man merkt xD
bakachan - Mi 04.06.08 10:55
Natürlich ist dann ein vergleich noch notwendig ...
Dein splitten in zeile 9 ist ja schonmal in Ordnung und die Anzahl kriegst du dann aus deinem String-Array (.Length) aber der komplette vergleich zum vorherigen node fehlt noch.
Außerdem weiss ich nicht was du mit diesem Code-Abschnitt erreichen willst:
C#-Quelltext
1: 2: 3: 4: 5:
| if (blabla != null) { TreeNode Parent = new TreeNode(); Parent.Nodes.Add(blabla); } |
du überprüfst ob das string-array null ist (also ob es keinen eingangsstring gab?)
erstellst einen TreeNode und weist diesem Subnodes zu ?
für mich ergibt das keinerlei sinn
Christian S. - Mi 04.06.08 11:07
SSC streezer hat folgendes geschrieben: |
also bei zeile 9 splitte ich die einzelnen zeilen bis ein . auftritt
ist dann ein vergleich noch nötig? |
Ja, logisch. Wenn Du meinen ersten Beitrag liest, steht da was von "mehr" / "weniger" / "gleich viel" Punkten. Das klingt irgendwie nach Vergleich. :|
SSC streezer hat folgendes geschrieben: |
| :S sorry mache das noch nicht so lange wie man merkt xD |
Eigentlich musst Du nur lesen, was wir Dir geschrieben habe, und das machst Du doch wohl schon länger ;-)
Schreib Dir am Besten in Worten auf, was Dein Programm machen soll. Klingt doof, sieht doof aus, hilft aber oft, sich klar zu machen, was man als Quelltext umsetzen muss.
SSC streezer - Mi 04.06.08 11:38
bakachan hat folgendes geschrieben: |
Außerdem weiss ich nicht was du mit diesem Code-Abschnitt erreichen willst:
C#-Quelltext 1: 2: 3: 4: 5:
| if (blabla != null) { TreeNode Parent = new TreeNode(); Parent.Nodes.Add(blabla); } |
du überprüfst ob das string-array null ist (also ob es keinen eingangsstring gab?)
erstellst einen TreeNode und weist diesem Subnodes zu ?
für mich ergibt das keinerlei sinn |
;) hab ich auch gerade bemerkt - es verweist auf sich selber - bzw. er druckt einfach das ganze array normal aus da es nie null sein wird... ;) ich voll noob xD naja
werds nochmal versuchen und mich sicherlich nochmal melden ;)
SSC streezer - Mo 09.06.08 12:52
also - hab das ganze jetzt rekursiv gelöst (wie mir ja schon x hundert mal gesagt wurde *smile*)
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| // mit dem ersten Element in elements einen neuen Knoten anlegen, sofern noch keiner vorhanden ist if (elements.Count > 0) { string keyString = elements[0]; TreeNode tn = null; if (!nodes.ContainsKey(keyString)) { tn = new TreeNode(keyString); tn.Name = keyString; nodes.Add(tn); } else { tn = nodes[keyString]; } // Nächste Ebene erstellen: // aufrufen mit den Elementen elements ohne das erste Element: elements.Remove(0) und der Nodes.Auflistung des // hier erzeugten Node elements.RemoveAt(0); ParseLineAndInsertNodesInTree(elements, tn.Nodes); } |
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!