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.