Laden...

Wie kann ich in ASP.NET MVC eine Treeview aus Arrays erstellen?

Erstellt von Telefisch vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.657 Views
T
Telefisch Themenstarter:in
375 Beiträge seit 2008
vor 5 Jahren
Wie kann ich in ASP.NET MVC eine Treeview aus Arrays erstellen?

Hallo Forum,
ich hab grade ne Denkblockade.
Ich möchte aus mehreren Strings eine Baumstruktur aufbauen und dann ein Treeview erstellen.
Aber eins nach dem Anderen.

Mein erstes Problem ist eigentlich die Daten dafür aufzubereiten.

Ich habe als Beispiel folgende Strings (einzelne Begriffe mit ',' getrennt:

Parent1, Child1, Child2, Child3
Parent2, Child1, Child2, Child3
Parent1, Child1, Child2, Child4
Parent1, Child1, Child2, Child4, Child5
Parent2, Child1, Child2, Child4
Parent1, Child2, Child3, Child4

Die Struktur ist immer der Reihenfolge nach, erster, zweiter, dritter, n-ter Knoten.
Die Anzahl der Knoten kann unterschiedlich sein. Es ist aber möglich, dass Knoten in verschiedenen Ebenen mehrfach vorkommen. -> keine Sortierung der Reihenfolge der Schachtelung.

Das Ergebnis sollte also so aussehen:

Parent1
>Child1
>>Child2
>>>Child3
>>>Child4
>>>>>Child5
>Child2
>>Child3
>>>Child4
Parent2
>Child1
>>Child2
>>>Child3
>>>Child4

Also mein erster Ansatz ist jetzt die Texte mit Split(',') in Arrays aufzuteilen und diese dann zusammen wieder in einem Array zu sammeln.
Das scheint mir aber alles etwas umständlich, zumal ich an jedem Knoten ja dann auch irgendwie wieder die zugehörigen Detail-Childs anfügen muss.

Gibt es für sowas irgend einen praktikablen Workaround?
Bin schon für die richtigen Suchbegriffe dankbar 🤔

Gruß Carsten

16.835 Beiträge seit 2008
vor 5 Jahren

Von was einem TreeView sprechen wir?
Soll das ein TreeView Objekt im Code sien (also Hierarchie) oder sprechen wir von einem UI Element auf HTML Basis?

Mir nicht ersichtlich, wo hier die Verbindung zu ASP.NET sein soll, oder ob es nur ein C# Thema ist?

T
Telefisch Themenstarter:in
375 Beiträge seit 2008
vor 5 Jahren

Nunja,
das ist nicht so sauber zu trennen.
Datenquelle sind die klassischen Models aus ASP.Net MVC, was im Moment aber eher nebensächlich ist. Ziel ist nachher ein, wie auch immer ausgeführtes Treeview auf der Website.
Auch da bin ich noch nicht ganz sicher.
Da einfaches Databinding mit meiner Datenquelle aber eher unmöglich ist habe ich mittlerweile den Ansatz alles „zu Fuß“ zu programmieren.
In welcher form dann das Treeview erstellt wird, wäre der nächste Schritt.

Wenn es da natürlich irgendwelche praktischen Wege gibt bin ich da sehr empfänglich für. ich hab den ganzen Tag mit den klassischen <ul><il> etc. rumgedaddelt, bin aber zuletzt gedanklich bei einer XML Struktur gelandet.
Aber wie gesagt, da bin ich noch völlig planlos 😦

Ich wollte jetzt erstmal die Daten aufbereiten und hätte diese dann halt manuell in eine Baumstruktur gepresst.
Somit ist es eigentlich wirklich momentan eher ein c# Thema.
Bin aber für jeden Hinweis dankbar...

5.658 Beiträge seit 2006
vor 5 Jahren

Hi Telefisch,

das ist nicht so sauber zu trennen.

Doch! [Artikel] Drei-Schichten-Architektur

ich hab den ganzen Tag mit den klassischen <ul><il> etc. rumgedaddelt, bin aber zuletzt gedanklich bei einer XML Struktur gelandet.

Die Darstellung und die Speicherung der Daten sollten unabhängig voneinander sein. Wenn man sich das klar macht, dann gibt es auch nicht so einen Knoten im Kopf.

Wenn du hierarchische Daten hast, dann benötigst du zuersteinmal ein hierarchisches Datenmodell. Ein Array ist kein hierarchisches Datenmodell. Stattdessen brauchst du so etwas:


public class Node 
{
  public List<Node> Children { get; set; }
  public string Name { get; set; }
}

Mit diesem Datenmodell kannst du die Daten aus der Datei lesen, verarbeiten, abspeichern, und direkt an den TreeView binden. Oder (wenn ein TreeView zuviel Overhead für dein Vorhaben ist) kannst du Schleifen verwenden, um verschachtelte Listen-Elemente zu erstellen, und formatierst diese mit CSS.

Weeks of programming can save you hours of planning

T
Telefisch Themenstarter:in
375 Beiträge seit 2008
vor 5 Jahren

Hallo MrSparkle,
natürlich hast Du Recht, dass man das grade bei ASP.Net MVC Trennen kann.
Mein Problem liegt in der Gänze allerdings in allen drei Bereichen und als ich den Threat angefangen hatte wollte ich das ganze Problem lösen.
Ich habe mich dann kurzfristig dazu entschlossen erstmal das Aufbereiten der Daten zu erledigen.
However...

Zum Problem.
Ich habe im Augenblick eine Astreine, geschachtelte Datenstruktur, die sich eigentlich ideal für ein Treeview eignet.
Bei den ersten Versuchen mit Treeviews musste ich allerdings feststellen, dass der eigentlich identifizierende Begriff des ersten Knotens einfach zu lang werden wird.
Daher wollte ich ein zusätzliches Feld für diese Strukturbegriffe einfügen um auch die "Gruppierung" dieser teilweise sehr ähnlichen Datensätze zu ermöglichen. Das lässt die Datenstruktur flexibel und schlank.

Als Beispiel:
Es gibt vielleicht 40 Datensätze die wie folgt benannt sind:
Heizkreis, geregelt, Mischer, Pumpe Typ 25/1-12
Unterschiede lediglich beim Pumpentyp
Dann nochmal 10 Datensätze:
Heizkreis, ungeregelt, Mischer, Pumpe Typ 25/1-12
Unterschied beim Pumpentyp und statt geregelt, wie die ersten Datensätze, ungeregelt.

Dann gibt es 12 Datensätze nach folgendem Muster:
Mischer, 3-pkt, Typ ABC
auch hier, Unterscheidung nach Typ.

Und jetzt noch 18 Datensätze wie folgt:
Mischer, 2-pkt, Typ 123
und wieder Unterscheidung im Typ.
Und Unterschied zum vorigen Beispiel in der Ansteuerung.

Es gäbe im Idealfall hier also einen Knoten Heizkreis, darunter einen Knoten geregelt und einen ungeregelt, die jeweils einen Knoten Mischer enthalten...usw.

Alle diese Datensätze haben ihre (für den Bearbeiter) Bezeichnung im gleichen Feld (Name).
Stelle ich diese Datensätze (die nebenbei noch einige schachtelungsebenen beinhalten) im Tree untereinander dar habe ich gleich unter dem ersten Knoten 80 Datensätze.
Da die Bezeichnung dem Bearbeiter aber freigestellt werden muss, habe ich auch auf eventuelle Sortierebenen keinen Einfluss.
Klar kann ich jetzt hergehen und Felder (oder sogar Tabellen) für 4 oder 5 Ebenen in jedem Datensatz anlegen aber das M.E. beschissen zu handeln und obendrein auf diese vorgefertigten Ebenen beschränkt.
Was liegt also näher als die Tree-Struktur nach einem String zu erstellen, den der User frei definieren kann? So hat er seine eigene Ordnung und muss für sich den besten Weg finden.

Um nun Dein vorgeschlagenes Datenmodell zu füttern brauche ich eben diese hierarchischen Daten. Und genau das ist es um was es geht.
Eben diese Daten aus dem String zu extrahieren und zur weiteren Verwendung zwischen zu speichern.

Wie gesagt, ich bin schon für einen passenden Suchbegriff dankbar 😦

1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

also das Anliegen kann ich verstehen, sofern all diese Daten nicht wirklich erfasst sind. (Wobei es mich persönlich schon erschreckt, wie manche Firmen mit ihren Daten umgehen...)

Die Vorgehensweise finde ich persönlich nicht so toll - du nennst es vll flexibel - letztendlich ist es das aber nicht wirklich, weil du allen Leuten bei der Benamung Ihrer Artikel (stillschweigend und in meinen Augen ohne Kontrollmuster) vorschreibst, wie ein Artikel benannt werden muss. Mag in einem kleinen Kreis funktionieren - kann aber schon beim ersten neuen Mitarbeiter schief gehen.

Da würde ich (wenn du nicht gerade Lust hast alle Daten nachzufassen) eher hingehen und eine Tabelle von Gruppen, die jeweils ihr Parent kennen anlegen und anschließend in der eigentlichen Datentabelle dafür sorgen, dass diese entsprechend ihre Gruppe (vll auch sogar Gruppen? - dann über eine weitere Tabelle) kennen. Für den Start kannst du das sicher auf Basis des Strings automatisiert anlegen - danach würde ich es jedoch den Leuten überlassen bewusst zu bestimmen unter welche Gruppe/Gruppen das Teil gehört.

Im Sinne von:
Group
-Id
-Name
-ParentId<Nullable, für Root-Objekte>

Data
-Id
-Name
-GroupId

oder direkt für mehrere Gruppen:
Group
-Id
-Name
-ParentId<Nullable, für Root-Objekte>

Data
-Id
-Name

GroupData
-Id
-GroupId
-ParentId

LG

T
Telefisch Themenstarter:in
375 Beiträge seit 2008
vor 5 Jahren

Hallo Taipi,
Genau die Struktur, die Du da aufzählst habe ich ja.
Es geht hier lediglich darum die erste Ebene in einem nem Treeview darzustellen.
Meine aktuelle Struktur sieht so aus:

Funktionsgruppen
—Eigenschaften
— Funktionen
——Eigenschaften
——Unterfunktionen
———Eigenschaften
———Makros
————Eigenschaften

Hier nochmal eine drei- oder vierstufige Schachtelung vor zu schalten führt eher zu mehr Fragen als zu Komfort.
Es handelt sich hier im übrigen um eine Engineering Datenbank die tatsächlich nur von sehr wenigen Bearbeitern verwendet wird.
Vielleicht baue ich später noch eine Art selbst erweiterndes Dropdown-Menü dazu damit bereits benutzte Phrasen vorgeschlagen werden.

Nun denn, in ein XML habe ich die Hierarchie mittlerweile übergeben können.
Jetzt bin ich grade beim Treeview.

Gruß Carsten