Autor Beitrag
ihmSelbst
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 17.02.14 17:09 
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:

ausblenden 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 user profile iconChristian S.: Quote- durch C#-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 17.02.14 17:15 
user profile iconihmSelbst hat folgendes geschrieben Zum zitierten Posting springen:
Die Tage hatte ich schonmal einen ähnlichen Tread gestartet,

Nein, hattest Du nicht, zumindest nicht hier. Schön, dass Du Dir noch nicht einmal die Mühe machst, das Posting für unser Forum anzupassen :?

Im übrigen steht in unseren Richtlinien (Abschnitt 3.10), dass Crossposts bitte auch verlinkt werden sollen. Hier der Link zu Deiner Frage bei mycsharp: www.mycsharp.de/wbb2....php?threadid=110934

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
ihmSelbst Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:
ausblenden volle Höhe 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;

    //Kinder eines Parent-Items holen, bzw. die Stamm-Items, wenn kein Parent angegeben ist
    public static TreeItem[] GetTreeItems( CSVItem[] datasource, TreeItem parent = null)
    {
      var parentId = parent != null ? parent.CSV.ID : NoParentId; //Parent-ID oder Stamm-ID?

      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 :-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: ihmSelbst
ihmSelbst Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 19.02.14 13:37 
Hallo Christian,

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:

(...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:

ausblenden volle Höhe 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)
    { 
      // Hat Kinder
      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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: ihmSelbst