Entwickler-Ecke
Basistechnologien - Aus CSV-Liste, die einen Kategoriebaum aufspannt, ein TreeVi
ihmSelbst - Mo 17.02.14 17:09
Titel: Aus CSV-Liste, die einen Kategoriebaum aufspannt, ein TreeVi
Hallo C#-Fans,
ich brauche bitte nochmal Eure Unterstützung bei meiner Geschichte mit der CSV-Datei und die darin enthaltenen Kategorien.
Die Tage hatte ich schonmal einen ähnlichen Tread gestartet, allerdings war dort das Ziel ein anderes, entsprechend hier die neue Anforderung:
Ich habe ein kleines Tool erstellt, um WebShops mit Artikeldaten zu befüllen.
Da beim Artikelimport die Kategorien des zu importierenden Artikels nicht feststehen, muss der Benutzer diese angeben.
Die Shopsoftware bietet die Möglichkeit eine CSV-Datei mit folgendem Inhalt rauszugeben:
categoryID;parentID;description;position
3;1;Deutsch;
4;1;Englisch;1
6;3;Krachmacher;
12;3;Trainingslager;1
25;3;Unterwegs;2
33;3;Fan-Wear;3
43;3;Halbzeitpause;4
52;3;Auto-Deko;5
59;3;Accessoires;6
69;3;KULT!;7
81;3;Büro;8
76;3;Blog;9
7;6;Trommeln;
8;6;Trompeten;1
10;6;Ratschen;2
11;6;Klatschstangen;3
Als beispiel sind "Klatschstangen" ein Child von "Krachmacher", welches ein Child von "Deutsch" ist.
Entsprechend habe ich eine Klasse erstellt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| class categoryObject { public int categoryID; public int parentID; public string description; public int position; } |
Ich kenne leider nicht die Anzahl der Ebenen, entsprechend macht es die Sache für mich nur noch unüberschaubarer.
Ziel soll sein ein TreeView-Element mit diesen Kategorie-Daten zu befüllen.
Natürlich soll man die Kategorien auswählen können (Checkbox), sodaß ich eine Liste bekomme, in der alle Artikelgruppen (mit IDs) drinstehen.
Kann mir hier vielleicht irgendeiner einen Denkansatz geben wie ich das bewerkstelligen soll, wenn ich nicht die genaue Anzahl der Ebenen kenne?
PS: Bitte nicht ganz so hart mit mir umgehen, bin ganz frisch in OOP / .net. ;-)
Grüße
ihmSelbst
Moderiert von
Christian S.: Quote- durch C#-Tags ersetzt
ihmSelbst - Mo 17.02.14 17:34
Hallo Christian,
ja, ich sehe es selbst gerade. Sorry für die 1:1 übernahme, ein bisschen anpassen wäre besser gewesen. :?
Ich bitte um Entschuldigung :-)
Nochmal zu meinem Thema, das TreeView-Element scheint mir ideal für die Anzeige, jedoch wäre ein ListView wesentlich einfacher im handling (auch nicht so schön in der Darstellung), oder sehe ich das falsch?
Christian S. - Mo 17.02.14 20:10
Ein TreeView ist hier sicherlich die bessere Wahl.
Folgendes wäre eine Idee, wie man den Baum aufbauen kann:
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: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| public class CSVItem { public int ID { get; set; } public int ParentID { get; set; } public string Title { get; set; } }
public class TreeItem { public CSVItem CSV {get; private set;}
public TreeItem Parent {get; private set;} public TreeItem[] Children {get; private set;}
public const int NoParentId = 1;
public static TreeItem[] GetTreeItems( CSVItem[] datasource, TreeItem parent = null) { var parentId = parent != null ? parent.CSV.ID : NoParentId; var items = (from csvItem in datasource where csvItem.ParentID == parentId select TreeItem.FromCSVItem(csvItem)).ToArray();
foreach(var item in items) { item.Parent = parent; item.Children = GetTreeItems(datasource, item); } return items; }
public static TreeItem FromCSVItem(CSVItem csvItem) { var result = new TreeItem(); result.CSV = csvItem; return result; }
} |
Wenn Du Dein Array aus CSVItems aus der Liste generiert hast, rufst Du im wesentlichen
TreeItem.GetTreeItems(deineListe) auf.
Aber ACHTUNG: Ist ungetestet und vom Laufzeitverhalten wahrscheinlich nicht so der Bringer. Aber als Ansatz sollte es erst einmal reichen :-)
ihmSelbst - Mi 19.02.14 13:37
Hallo Christian,
Christian S. hat folgendes geschrieben : |
(...Code...)
Wenn Du Dein Array aus CSVItems aus der Liste generiert hast, rufst Du im wesentlichen TreeItem.GetTreeItems(deineListe) auf.
Aber ACHTUNG: Ist ungetestet und vom Laufzeitverhalten wahrscheinlich nicht so der Bringer. Aber als Ansatz sollte es erst einmal reichen :-) |
Erstmal
herzlichen Dank für Deine Arbeit, selbst nach meinem versemmelten Start!! ;-)
Jetzt bitte nicht lachen, ich habe es wie folgt umsetzen können:
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: 34: 35:
| TreeNode rootNode = new TreeNode();
rootNode.Text = "Root"; foreach (TreeItem ti in TreeItem.GetTreeItems(ZeilenAusCSV.ToArray())) { TreeNode tn = new TreeNode();
tn.Text = ti.CSV.description; tn.Name = ti.CSV.categoryID.ToString();
if (ti.Children.Length > 0) { foreach (var SubNode in ti.Children) { TreeNode child = new TreeNode(); child.Text = SubNode.CSV.description; child.Name = SubNode.CSV.categoryID.ToString(); if (SubNode.Children.Length > 0) { foreach (var SubSubNode in SubNode.Children) { TreeNode childchild = new TreeNode(); childchild.Text = SubSubNode.CSV.description; childchild.Name = SubSubNode.CSV.categoryID.ToString(); child.Nodes.Add(childchild); } } tn.Nodes.Add(child); } } rootNode.Nodes.Add(tn); } treeView1.Nodes.Add(rootNode); } |
Aber das ist alles andere als rekursiv.. :) Wenn es nun noch ein ChildChildChild-Element geben sollte, bin ich schon mit meinem Latein am Ende...
Gibt es hier vielleicht eine besseren, rekrusiven weg?
Danke vorab für Eure Unterstützung.
Grüße
ihmSelbst
Christian S. - Mi 19.02.14 13:44
Du kannst mein Beispiel ziemlich leicht übertragen, denn mein TreeItem ist ja nicht sooo anders als ein TreeNode im TreeView.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!