DataSet - vorkommende Kategorien in einer gefilterten BindingSource auslesen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von DerSmurf.

    DataSet - vorkommende Kategorien in einer gefilterten BindingSource auslesen

    Hallo ihr lieben
    Mein Programm steht kurz vor der Vollendung. Nach langem habe ich aber mal wieder eine Frage.
    Ich habe mir eine Userform gebastelt, mit der ich Bestellungen täten möchte.
    Hierzu wähle ich einen, oder mehrere, Lieferanten aus und filtere meine Artikelliste (bzw. die BSArtikel) nach diesen Lieferanten.
    Zusätzlich hat noch jeder Artikel eine Kategorie. Nach Änderung des BSCurrent aus der Kategorie Bindingsource, sollen die Artikel zusätzlich nach dieser Kategorie gefiltert werden. Soweit kein Problem.

    Es werden mir allerdings in meiner BSKategorie alle vorhandenen Kategorien angezeigt. Ich möchte, dass nur Kategorien erscheinen, die auch in den Artikeln der gefilterten BSArtikel auftauchen.
    Mir fällt aber kein Ansatz ein, wie ich das bewerkstelligen kann. Dabei müssen die Kategorien natürlich nicht über eine BindingSource angesprochen werden. Der User soll die Kategorien in einem DGV auswählen können. Wie Sie darein kommen (BS, List( Of ...), ist mir wurscht.

    Hier der bisherige Code:

    VB.NET-Quellcode

    1. Public Class UCBestellung
    2. Private _ListOfCompaniesToOrder As New List(Of DtsDaten.LieferantRow)
    3. Public Sub SetCompanyToOrder(company As DtsDaten.LieferantRow)
    4. If Not _ListOfCompaniesToOrder.Contains(company) Then _ListOfCompaniesToOrder.Add(company)
    5. FilterItemsBySupplier()
    6. End Sub
    7. Private Sub FilterItemsBySupplier()
    8. BSArtikel.Filter = $"LieferantID = {_ListOfCompaniesToOrder(0).ID}"
    9. If _ListOfCompaniesToOrder.Count > 1 Then
    10. For Each company In _ListOfCompaniesToOrder
    11. BSArtikel.Filter &= $" OR LieferantID = {company.ID}"
    12. Next
    13. End If
    14. End Sub
    15. End Class


    und ein Screenshot des DataSet (bisschen abgeschnitten - aber das Relevante ist drauf.

    *Topic verschoben*
    Bilder
    • dts.png

      222,78 kB, 3.202×1.650, 66 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Nochmal bitte kurz für mich: Soll der Kunde aus allen Kategorien wählen oder aus denen der Artikel?
    Welche Kategorien dem User auch immer dann zur Auswahl stehen: Du müsstest also eine Auswahlmöglichkeit zur Verfügung stellen, z.B. mit einer CheckedListBox. Die kann auch DataBinding, wenn man sie über den Code dazu zwingt. Und dann eben schauen, welche Kategorien angewählt wurden und diese dann als List(Of Kategorie) als DataSource zu Deiner eigentlichen BsKategorien.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Jupp.
    Also sagen wir ich habe INSGESAMT drei Kategorien (Kat1, Kat2, Kat3) und 10 Artikel (Art0 bis Art9).
    Die Artikel Art0 - Art4 gehören zur Kat1
    Die Artikel Art5 - Art9 gehören zur Kat2
    In diesem Fall sollen nur die Kategorien Kat1 und Kat2 zur Auswahl stehen (Kat3 entfällt also, weil hier kein Artikel zugehört)

    Mir fehlt hier gerade der Ansatz wie ich aus eine gefilterten BS (ArtikelTable gefiltert nach Lieferanten) auf die Kategorien der Artikel komme.
    ?( Die Artikel haben doch alle ne Kategorie. Um also die Kategorien zu bekommen:

    VB.NET-Quellcode

    1. Dim MöglicheKategorien = VorhandeneArtikel.Select(Function(x) x.Kategorie).Distinct
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    jo, und mit dieser KategorienListe kannste zB auch einen BS-Filter bauen, fast genauso wie du es in post#1 ja schon für Artikel hast.

    Übrigens probierma so:

    VB.NET-Quellcode

    1. Private Sub FilterItemsBySupplier()
    2. BSArtikel.Filter = String.Join(" OR ", _ListOfCompaniesToOrder.Select(Function(x) $"LieferantID = {x.ID}"))
    3. End Sub
    oder so:

    VB.NET-Quellcode

    1. Private Sub FilterItemsBySupplier()
    2. BSArtikel.Filter = $"LieferantID in ({ String.Join(", ", _ListOfCompaniesToOrder.Select(Function(x) x.ID))})"
    3. End Sub

    VaporiZed schrieb:

    VB.NET-Quellcode
    Dim MöglicheKategorien = VorhandeneArtikel.Select(Function(x) x.Kategorie).Distinct


    Mein Problem ist, dass ich auf diesem Weg nicht an Kategorien komme, da ich die Artikel nur in der BindingSource habe:

    VB.NET-Quellcode

    1. Dim MöglicheKategorien = BSArtikel.Select(Function(x) x.Kategorie).Distinct


    Hab ich einen Denkfehler, oder geht das einfach nicht über die BindingSource und ich muss folgenden Umweg gehen?

    VB.NET-Quellcode

    1. Private Sub FilterCategoriesByItems()
    2. Dim PossibleCategories As IEnumerable(Of DtsDaten.KategorieRow)
    3. For Each Company In _ListOfCompaniesToOrder
    4. PossibleCategories = Company.GetArtikelRows.Select(Function(x) x.KategorieRow).Distinct
    5. Next
    6. For Each category In PossibleCategories
    7. MessageBox.Show(category.Name)
    8. Next
    9. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DerSmurf“ ()

    @DerSmurf: Ich hab ja auch nicht von BSArtikel.Select(Function(x) x.Kategorie).Distinct geschrieben, da die BS nicht die Artikelauflistung ist, sondern nur über die DataSource kennt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Sorry, habe ein bisschen gebraucht, weil ich scheinbar (etwas zu feste) auf dem Schlauch gestanden habe.

    Meine fertige Lösung sieht nun so aus:

    VB.NET-Quellcode

    1. Private Sub FilterCategoriesByItems()
    2. Dim FilteredItems = BSArtikel.Cast(Of DataRowView).Select(Function(dr) DirectCast(dr.Row, ArtikelRow)).ToArray
    3. Dim UsedCategorys = FilteredItems.Select(Function(x) x.KategorieRow).Distinct
    4. BSKategorie.Filter = $"ID in ({ String.Join(", ", UsedCategorys.Select(Function(x) x.ID))})"
    5. End Sub


    Den BSArtikel.Filter habe ich ebenfalls in den Einzeiler aus Post 5 verwandelt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DerSmurf“ ()