Laden...

Hierarchie mit Bindingsoures abfragen

Letzter Beitrag vor 14 Jahren 3 Posts 1.024 Views
Hierarchie mit Bindingsoures abfragen

Guten Tag.

Ich habe 2 Tabellen, Kategorie und Produkt.
An die Daten komme ich über Bindingsources.

In der Tabelle Kategorie befindet sich eine Hierarchie.
Das heißt eine Kategorie ist evtl eine Unterkategorie einer anderen.

Jetzt zu meinem Problem.
Die Produkte sind nur in den Unterkategorien enthalten.
Wenn die Vaterkategorie angewählt wird, sollen aber alle Produkte der Unterkategorien angezeigt werden.

Bsp:
Kategorien:


Name                    ID      Parent
Rund ums Haus           1         null
Haushalt                2          1
Garten                  3          1

Produkte:


Name                Kategorie
Rasenmäher            3
Mixer                 2

Bis jetzt mache ich es folgendermaßen:

Combobox 1: Parent_Kategorie, Bindingsource1 über Tabelle Kategorien.
Combobox 2: Child_Kategorie, Bindingsource2 über FK_Tabelle in Bindinsource1
Datagridview: Daten, Bindingsource3 über FK_Tabelle in Bindingsource 3

So bekomme ich zumindest mal für die Unterkategorien die Produkte angezeigt.
Wie schaffe ich es jetzt am Besten wenn ich "Rund ums Haus" anwähle, dass ich dann "RAsenmäher" und "Mixer" angezeigt bekomme?

Use the source, Luke!

Nur, weil man vor sich eine CPU hat, muß man das Denken nicht
einstellen.

Hallo prakti08

Ich habe schon verstanden, was du möchtest, aber bezweifle, dass eine ComboBox die optimale Lösung ist. Ich würde dies mit einer Listbox versuchen.
Auf jeden Fall geht das mit DataColumn.Expression arbeiten.
Und zwar am besten, jedesmal wenn die Auswahl in den ListBoxen sich ändert aktualisierst du den Filter, der enstprechenden Bindingsource.

So mach ich es Zumindest.


ListBox1_SelectedIndexChanged(...)
{
  KategorienRow current = (KategorienRow) ((DataRowView)BindingSource1.Current).Row;
var sb = new StringBuilder();

int i =0;

 foreach(var row in current.GetKategorienRows())
{

 if(i==0)
{
sb.AppendFormat("'Kategorie'= {0}",row.ID);
}
else
{
sb.AppendFormat(" OR 'Kategorie'= {0}",row.ID); //EDIT: AND mit OR ersetzt
}
i++;
}

BindingSource3.Filter = sb.ToString();
}

Ist jetzt ungestestet und nicht gerade beste Schule aber so in etwa sollte es funktionieren.

Gruss

Balaban_s

sowas kann man vlt. auch mit dem Konzept der nested Sets behandeln

Also eine Kategorie hat nicht nur eine ID, sondern einen Bereich (startwert und Länge). Kategorien ohne unterkategorien haben die Länge 1, übergeordnete Kategorien geben die Gesamt-Anzahl ihrer Unterkategorien an.
Ein Produkt matcht nun eine Kategorie nicht nur, wenn die KategoryID übereinstimmt, sondern auch , wenn seine KategoryID innerhalb des Bereiches einer Kategory höherer Ordnung ist.
So vermeidest du ellenlange FilterAusdrücke in den bindingsources, und kannst mit

bs.Filter = "CategoryID>"+cat0+"And CategoryID<"+cat1";

alles abdecken.

Aber schön kniffelig 😉

Der frühe Apfel fängt den Wurm.