Autor |
Beitrag |
estrella1410
      
Beiträge: 46
|
Verfasst: Do 11.09.08 10:31
ALso ich habe da ein kleines Problem...
ich hab eine DB eingebunden und ich möchte gerne gewisse dinge in einem treeview anzeigen
mein problem ist folgendes:
die wichtigen spalten sieht ungefähr so aus:
Name abteilung
müller A
möller B
meier A
pio C
wolf A
....
ich möchte nun dass die so sortiert werden dass der knoten die abteilung is un die namen unten angeordnet sind aber ich finde keine anständige seite im net die mir da mal auf die sprünge helfen kann...
Kann mir da ggf. wer helfen ?
Greetz Estrella Moderiert von Christian S.: Topic aus C# - Die Sprache verschoben am Do 11.09.2008 um 11:27Moderiert von Christian S.: Topic aus WinForms verschoben am Do 11.09.2008 um 12:03
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 11.09.08 11:27
Wo genau hakt es denn?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
estrella1410 
      
Beiträge: 46
|
Verfasst: Do 11.09.08 12:00
Name abteilung
müller A
möller B
meier A
pio C
wolf A
also ich habe vorher noch nie mit db´s gearbeitet also es hakt demnach da, dass ich nicht weis wie ich das aufbauen muss damit es flogendermaßen aussieht : (im net finde ich einfach keine anständigen seiten die mir die sql befehle unter c# erläutern bzw. wie ich sie einbinden kann)
also so solls aussehn:
A
---müller
---meier
---wolf
B
---möller
C
---pio
"---" steht hier halt für die abzweigung wie sie in nem treeview sein soll...aber ich kriegs einfach nicht so hin ...
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 11.09.08 12:09
Dann verschieb ich das doch erst nochmal nach Datenbanken, wenn es an der Stelle das Problem gibt.
Die SQL-Anweisungen unter C# sind nicht anders als anderswo. Will heißen: Wie die auszusehen haben, richtet sich nach der verwendeten Datenbank und nicht nach der verwendeten Programmier-Sprache.
Ich würde die Abfrage so gestalten:
SQL-Anweisung 1:
| SELECT * FROM deineTabelle ORDER BY abteilung, name |
Ich nehme mal an, dass Du Informationen zu Abteilung und Person noch in zwei anderen Tabellen hast, aber das Prinzip sollte klar sein. Wenn ich die Order-By-Klausel jetzt nicht genau falsch rum gemacht habe (  ), dann sollten die Zeilen aus der Datenbank so aussehen:
Quelltext 1: 2: 3: 4: 5:
| Meier A Müller A Wolf A Möller B Pio C |
Die Zeilen kannst Du dann durchgehen. Jedes Mal, wenn die Abteilung wechselt (also von A nach B oder von B nach C), legst Du einen neuen Elterknoten an, sonst immer nur Kindknoten.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
estrella1410 
      
Beiträge: 46
|
Verfasst: Di 16.09.08 09:57
also ich hab es ja schonmal hinbekommen dass er wenn A schonmal da war nicht ein neues erstellt also jeweils ein A, B und C nur...aber ich kriege das mit den unterzweigen einfach nicht hin ...kennt jemand eine GUTE seite wo das beschrieben ist, wie es funktioniert mit diesen "CHildNodes" (glaub so nennt man diese) weil meine ParentNodes sollen ja A, B und C sein ....
HELP
|
|
estrella1410 
      
Beiträge: 46
|
Verfasst: Di 16.09.08 11:48
also ich habs nun soweit hinbekommen, dass er mir den ersten knoten und den ersten unterpunkt jeweils immer anzeigt also so:
A
----Müller
B
----Meier
C
----Schröder
aussehn müsste es so:
A
----Müller
----Schimanski
B
----Meier
----Trallala
C
----Schröder
Jedoch alle weitern Punkte ordnet er nicht zu ich hab auch schon geschaut ob die werte überhaupt in der variable übergeben werden und sie werden übergeben aber landen nachher nicht im listview...versteh nicht warum..
ich poste mal meinen code:
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: 34: 35:
| OleDbConnection con = new OleDbConnection(); OleDbCommand cmd = new OleDbCommand(); con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Dokumente und Einstellungen\\Desktop\\db1.mdb;";
con.Open(); cmd.Connection = con; cmd.CommandText = @"SELECT * FROM daten ORDER BY Feld1, Name;";
OleDbDataReader dr = cmd.ExecuteReader(); treeView1.CheckBoxes = true; string Knoten1=""; TreeNode Knoten; while (dr.Read()) {
string Abteilung = dr[0].ToString(); string Name = dr[2].ToString(); Knoten = new TreeNode(Abteilung);
if (Knoten1 == Knoten.Text) { Knoten.Nodes.Add(Name); } else { Knoten = treeView1.Nodes.Add(Abteilung); Knoten.Nodes.Add(Name); Knoten1 = Knoten.Text; } } |
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
lothi
      
Beiträge: 114
Erhaltene Danke: 3
|
Verfasst: Di 16.09.08 13:18
Hallo
Also ich würde das so machen:
Eine Variable string abteilung = "".
Beim 1. Durchlauf der while Schleife prüfst du, ob der Inhalt der abteilung gleich ist wie der Inhalt aus der Datenbank. Wenn nein legst du ein neuer Stammknoten mit dem Inhalt aus der Tabelle und einen Unterknoten mit dem ersten Namen an. Speichere die Abteilung aus der Tabelle in die Variable.
Beim 2. Durchlauf prüfst du ob Variable == 2. Zeile der Tabelle, wenn ja im Knoten1 einen neuen Unterknoten mit dem Namen hinzufügen; wenn nein neuer Haupt- mit Unternkoten erstellen. u.s.w
Gruss Lothi
|
|
estrella1410 
      
Beiträge: 46
|
Verfasst: Di 16.09.08 14:12
aber genau das habe ich ja da gemacht ...oder wie erstelle ich einen neuen unterknoten ??? vielleicht is da mein fehler...weil:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
|
Knoten = new TreeNode(Abteilung);
if (abteilung2 == Abteilung) { Knoten.Nodes.Add(Name); } else { Knoten = treeView1.Nodes.Add(Abteilung); Knoten.Nodes.Add(Name); abteilung2 = Abteilung; } |
das is ja genau das was ich eben schon gemacht habe .... nur ich denke mein problem liegt im ersten teil der if schleife demnach die erzeugung der unterknoten...
Moderiert von AXMD: Code- durch C#-Tags ersetzt
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 16.09.08 15:41
Die (überflüssige) Zeile ist dein Fehler:
C#-Quelltext 1:
| Knoten = new TreeNode(Abteilung); |
Dadurch erzeugst du doch immer wieder einen neuen Knoten, der keinem TreeView zugeordnet ist und demnach dann unsichtbar.
Also einfach diese Zeile löschen und gut ist...
|
|
estrella1410 
      
Beiträge: 46
|
Verfasst: Mi 17.09.08 11:49
herrjee...
da macht ein satz einen so verrückt...
DANKE
läuft nun!
|
|
naishweb
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 08.12.10 16:24
Hallo estrella1410!
Hallo liebe Entwickler Gemeinde!
Ich habe das gleiche Problem wie estrella1410 und stolperte über diesen Thread. Beim ersten lesen wunderte ich mich über deinen Ratschlag Th69, denn das sollte, und dies bestätigt auch der Versuch, einen Fehler erzeugen da in der if-Abfrage eine nicht deklarierte Variable (Knoten) verwendet wird.
Da ich wie gesagt das gleiche Problem habe würde mich nun interessieren wie man dieses Lösen kann.
Hat einer lust dieses Rätsel mit mir zu lösen? Vorschläge?
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 08.12.10 17:23
Ich dachte schon, ich wäre senil, daß ich diesen Beitrag von mir nicht mehr kenne (aber dann habe ich gesehen, daß er schon zwei Jahre alt ist).
Hallo naishweb,
die Variable muß natürlich irgendwo deklariert sein, also
C#-Quelltext
jedoch ist es ein häufiger Anfängerfehler, zuerst der Variablen einen Wert (mittels new) zuzuweisen und eine (oder ein paar) Zeile(n) später, die Variable wieder mit einem anderen Wert zu überschreiben bzw. dann auf den falschen Wert zuzugreifen (hier in der Schleife).
Im konketen Fall sollen ja nur dann neue Abteilungen erzeugt werden, wenn noch keine existiert. Da die Daten von der Datenbank sortiert nach Abteilung und Name eingelesen werden, reicht es zu prüfen, ob die aktuelle Abteilung gleich oder ungleich der zuletzt verwendeten Abteilung ist. Und in der Variablen 'Knoten' wird daher immer die zuletzt angelegte Abteilung gespeichert, damit im nächsten Durchlauf dann mittels Knoten.Nodes.Add(...) ein neuer Unterknoten erzeugt werden kann.
So ich hoffe, du hast jetzt alles verstanden -)
Aber was ist dein konkretes Problem? Am besten du zeigst mal deinen Code...
|
|
naishweb
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 08.12.10 22:03
Verzeih ich bin mit den begrifflichkeiten durcheinander gekommen, ich meine Instanzieren und nicht deklarieren. Wenn man die von dir oben erwähnte Zeile allerdings weglässt fehlt für Zeile 26 die Instanzierung. Es gäbe keine Instanz der Variable.
der Zitat des Quelltextes:
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: 34: 35:
| OleDbConnection con = new OleDbConnection(); OleDbCommand cmd = new OleDbCommand(); con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Dokumente und Einstellungen\\Desktop\\db1.mdb;";
con.Open(); cmd.Connection = con; cmd.CommandText = @"SELECT * FROM daten ORDER BY Feld1, Name;";
OleDbDataReader dr = cmd.ExecuteReader(); treeView1.CheckBoxes = true; string Knoten1=""; TreeNode Knoten; while (dr.Read()) {
string Abteilung = dr[0].ToString(); string Name = dr[2].ToString(); Knoten = new TreeNode(Abteilung);
if (Knoten1 == Knoten.Text) { Knoten.Nodes.Add(Name); } else { Knoten = treeView1.Nodes.Add(Abteilung); Knoten.Nodes.Add(Name); Knoten1 = Knoten.Text; } } |
Zwar wurde in Zeile 13 die Variable deklariert, dies reicht doch in C# allerdings nicht aus, oder? Vor Zuweisung eines Wertes oder Nutzbarkeit der Instanz muss diese Instanziert werden. Dies währe normalerweise die Zeile 13, was bei dieser Art von Instanzierung allerdings jedesmal einen neuen Knoten erzeugen würde, der keinem Treeview zugeordet ist und wäre er dem Treeview zugeordet dann einen neuen Hauptknoten erzeugen würde und nicht einem ersten Knoten untergeordnet währe. //<- Man ist der Satz lang
Ergo würde als Beispiel ein Zweiter Hauptknoten mit dem Namen Abteilung A entstehen, währe er dem Treeview zugeordnet, andernfalls bleiben alle folgenden Einträge ausser dem Ersten einfach weg, was ja auch in der Fehlerbeschreibung von estrella1410 schon erwähnt worden ist.
hingegen wird in der Else-Klausel der Knoten als Knoten des Elements treeview Instanziert, was die Eintragung des ersten Eintrags Erzeugt.
Die frage ist also Wie sage ich in Zeile 26: Knoten ist der Knoten der in der ElseKlausel im vorigen durchlauf erzeugt wurde. da die Instanzierung in der While-Schleife erzeugt werden muss räumt die Garbage-Collection diese Instanz mit Ende und neu Anfang der Schleife ja ab... und ohne Zeile 19, die momentan allerdings wie bereits geschildert nicht auf den exakten Knoten des exakten Treeviewelements zeigt funktioniert Zeile 26 nicht.
Versteht man das? Beim schreiben hab ich schon nix mehr verstanden, haha Scherz! Tut mir Leid das es so kompliziert wird, kann aber auch nix für, hehe!
Mein Code sieht ziemlich Identisch aus, hat nur andere Namen...
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 08.12.10 22:25
Der Trick ist gerade, daß der erste Knoten (Abteilung) immer erstellt wird, d.h. der else-Teil durchlaufen wird (da die Abfrage "abteilung == Abteilung" immer 'false' ergibt, da abteilung mit "" initialisiert ist).
Ah... jetzt sehe ich den Fehler in deinem Programm, du hast die Änderung von estrella1410 noch nicht drin, s. www.c-sharp-forum.de....php?p=523841#523841
Um nochmal alles aufzuzeigen, nun meine Lösung:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| string abteilung = ""; TreeNode knoten = null;
while (dr.Read()) { string Abteilung = dr[0].ToString(); string Name = dr[2].ToString();
if (abteilung == Abteilung) { knoten.Nodes.Add(Name); } else { knoten = treeView1.Nodes.Add(Abteilung); knoten.Nodes.Add(Name); abteilung = Abteilung; } } |
|
|
naishweb
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 08.12.10 23:08
Also wenn ich diese Variante so übernehme bekomme ich immernoch den Compilerfehler(Verwendung der nicht zugewiesenen Variable nameNode). Ich häng mal meinen Code an, vielleicht sieht ihr/du ja was ich überseh:
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: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52:
| connection.ConnectionString = CONSTRING; connection.Open(); OleDbCommand commando = new OleDbCommand(); commando.Connection = connection; commando.CommandText = "SELECT p_MID, title, indexNumber, Lastname, firstname, p_ID FROM T_cable INNER JOIN T_person ON T_cable.createdBy=T_person.p_ID ORDER BY p_id,p_MID;"; OleDbDataReader Reader = commando.ExecuteReader(); TreeNode nameNode; while (Reader.Read()) {
#region Sammeln der Daten aus der Datenbank Farben cable = new Farben(); Verantwortlicher person= new Verantwortlicher(); if (!Reader.IsDBNull(0)) { cable.DatabaseID = Reader.GetInt32(0); } if (!Reader.IsDBNull(1)) { cable.Titel = Reader.GetString(1); } if (!Reader.IsDBNull(2)) { cable.Nummer = Reader.GetString(2); }
if (!Reader.IsDBNull(3)) { person.LastName = Reader.GetString(3); } if (!Reader.IsDBNull(4)) { person.FirstName = Reader.GetString(4); } if (!Reader.IsDBNull(5)) { person.Id = Reader.GetInt32(5); } #endregion
if (person.Id == lastPersonID) { nameNode.Nodes.Add(cable.DatabaseID.ToString()); } else { nameNode = mNode.Nodes.Add("(" + person.Id + ") " + person.LastName); nameNode.Nodes.Add(cable.DatabaseID.ToString()); lastPersonID = person.Id; } |
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 09.12.10 12:22
Ja, der Compiler kann nicht wissen, daß die Variable zuerst im else-Teil zugewiesen wird, daher eine explizite Null-Zuweisung:
C#-Quelltext 1:
| TreeNode nameNode = null; |
(habe ich in meinem Beispielcode aber auch so stehen
P.S. Außerdem solltest du noch
C#-Quelltext
vor der Schleife setzen, damit beim Aufruf nicht zufällig schon die erste person.Id gleich diesem Variablenwert ist.
|
|
naishweb
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 09.12.10 12:40
//die -1 steht irgendwo, danke.
Wenn ich jetzt aber ne explizite null Zuweisung mache, dann zeigt der Node ja nicht mehr auf den richtigen Knoten im richtigen TreeView, oder soll die null Zuweisung außerhalb der Schleife schon bei der Deklaration sein?
Ja
Frage beantwortet, des geht!
Danke!
|
|