Combobox mit Werten aus einer M:N Beziehung doppelte Werte vermeiden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Combobox mit Werten aus einer M:N Beziehung doppelte Werte vermeiden

    Hi,

    bin mit meinem kleine Projekt schon weiter und bin am "rumdoktoren" einer Combobox.
    Mein typisiertes Dataset besteht aus 3 Tabellen: Land, Logistiker und Zone.
    Die Tabelle Land hat eine 1:n Beziehung zur Zone sowie auch die Tabelle Logistiker hat eine 1:n Beziehung zur Zon.

    Ich möchte jetzt alle Länder(Tabelle Land) habe die Zonen für den Logistiker hat und das ganze in eine Combobox eintragen.
    Das Probleme seht ihr bestimmt schon:
    Ich bekomme wenn es 10 Zonen von einem Logistiker in einem Land gibt. 10 Einträge in die Combobox.

    Habe jetzt schon einiges umgearbeitet und verschiedene Ansätze probiert komme aber nicht weiter.

    Grob sieht meine Funktion jetzt so aus, wobei hier die Combobox jetzt komplett erstmal raus ist da ich ja erstmal die Abfrage richtig bekommen muss. Der Eintrag in die Combobox ist einfach.

    VB.NET-Quellcode

    1. Public Function fncCboLand_fuellen() As String
    2. Dim dtblogistik = dsDaten.tblLogisitk
    3. Dim dtbLand = dsDaten.tblLand
    4. Dim dtbZone = dsDaten.tblZone
    5. cboLAND.Items.Clear()
    6. Dim LogisitkerZeile = dtblogistik.Where(Function(x) x.LOK_LOGISTIKER = strLogistik)
    7. Dim LogistikerID = LogisitkerZeile.Select(Function(x) x.LOK_ID).First
    8. Dim ZoneZeile = dtbZone.Where(Function(x) x.ZON_LOKID = LogistikerID)
    9. End Function


    ... und jetzt hängt es bei mir. Ich wähle alle Zonen aus an Hand der LogistikerID aus.
    Muss ich jetzt mit For each weiterarbeiten oder kann ich mit LINQ weiterarbeiten bzw. wie arbeite ich damit weiter?

    Merci schon mal vorab.

    ErfinderDesRades schrieb:

    Sry, ich verstehe deine Sprache nicht.Zitat von TimH: „Ich möchte jetzt alle Länder(Tabelle Land) habe die Zonen für den Logistiker hat und das ganze in eine Combobox eintragen.“Was bedeutet das?


    Ok ich probiers anders zu erklären.
    Ich möchte das ich in der Combobox nur die Länder angezeigt bekommen in der, der Logistiker auch liefert.

    Was ich vergessen habe zu erwähnen das ich den Logistiker über ein Radiobutton vorher anwähle, sprich ich setze hier die String Variable und lese darüber die LOK_ID aus der Tabelle Logistiker aus.

    Zur besseren Verständnis noch mein Datenmodell.


    Hoffe es ist verständlicher.
    Jo, verstanden.
    Und dassis auch nicht soo einfach zu lösen.
    Ich würde da ein LinqToDataset - Gebastel anwenden, ähnlich wie dort gezeigt mit einem Hashset, wo immer genau die Datensätze drinne stehen, die du haben willst.



    Hmm - ich glaub, ganz so schwierig ists doch nicht, man könnte auch eine DataExpression finden, die der BindingSource der Combo den Filter nach deinem Wunsch setzt.
    Allerdings wird die Expression kompliziert - könnte ich dir bauen, wenn du mir ein TestProjekt zur Verfügung stellst, welches ein gefülltes Dataset beinhaltet.

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

    Hallo ErfinderdesRades,

    danke für den Tipp ich konnte das von dir vermittelt gut umsetzen auch wenn ich knapp ne Stunde dafür saß um zu verstehen was da alles gemacht wird.
    Ebenfalls danke für das Angebot, ich bin aber jemand der gerne die Sachen selbst löst und nur Unterstützung auf dem Lösungsweg brauch ;) .

    Folgt hier die meine Lösung. Evtl. ist noch Verbesserungsbedarf bzw. sieht jemand noch Lücken.
    Bis jetzt ist mir kein Fehler aufgefallen bzw. in den Tests keine Exception aufgetreten.

    VB.NET-Quellcode

    1. Public Function fncCboLand_fuellen(intLOKID As Integer) As String
    2. Dim dtblogistik = dsDaten.tblLogisitk
    3. Dim dtbLand = dsDaten.tblLand
    4. Dim dtbZone = dsDaten.tblZone
    5. Dim ZONZeilen = dtbZone.Where(Function(x) x.ZON_LOKID = intLOK_ID)
    6. Dim Zoneloks = ZONZeilen.Select(Function(x2) x2.tblLandRow)
    7. Dim hsZoneloks = New HashSet(Of tblLandRow)(Zoneloks)
    8. Dim dv = dtbLand.Where(Function(x3) hsZoneloks.Contains(x3)).AsDataView
    9. cboLAND.DataSource = dv
    10. cboLAND.DisplayMember = "LAN_KUERZEL"
    11. cboLAND.ValueMember = "LAN_ID"
    12. End Function

    TimH schrieb:

    bzw. sieht jemand noch Lücken.
    die Function gibt nix zurück, sollte also eine Sub sein.
    intLOK_ID ist hofflich nur ein Abschreibfehler, weil der Parameter heisst intLOKID.

    Und wie gesagt: Vermutlich kann man das auch mit einer DataExpressions: Filter und berechnete Spalten im Dataset lösen, unter Verwendung der Syntax für verknüpfte Tabellen.
    Da muss man immer einiges herumprobieren, bis passt, aber dann ists nur ein Eintrag im Form-Designer in die BindingSource.Filter-Property.
    Eine Extra-Methode ist dann komplett entbehrlich.