Nächst höheren Wert in typisierten Dataset suchen

  • VB.NET
  • .NET 4.5

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von TimH.

    Nächst höheren Wert in typisierten Dataset suchen

    Hallo zusammen,
    bevor Ihr mich wegen sowas simplem steinigt.. ich bin in VB.Net blutiger Anfänger.
    Ursprünglich habe ich ein paar kleine Scripte geschrieben oder mich mehr mit VBA in Excel und teils Access beschäftigt.
    Jetzt stehe ich aber davor und muss ein eigenständiges "Programm" bauen.

    Die Viedos vom ErfinderdesRades habe ich mir angesehen und denke soweit auch verstanden.

    Ich habe dazu ein typisiertes Dataset über den Dataset Designer erstellt und ein paar Tabellen mit 1:n Verbindungen erstellt.
    Das ganze lese und schreibe ich dann per ReadXML und WriteXML in eine XML.


    Mein jetziges Problem vor dem ich steht.
    Bis jetzt habe ich eine Winform in der eine Textbox enthalten ist in der man ein Gewicht einträgt dieses Gewicht muss dann in der Spalte "Gewicht" der Tabelle "Kosten" gesucht werden und wenn es nicht gefunden wir das nächst höhere Gewicht gewählt werden.

    Und jetzt kommt die Steinigung von allen:
    Wie mache ich das?
    Klar ist ich könnte mit einer ForEach Schleife die Tabelle in der Spalte Gewicht durchlaufen und wenn das Gewicht >= ist die weiterarbeiten(bzw. aktuell eine Messagebox ausgeben) und die Schleife abbrechen.
    Das Problem dabei ist das die Tabelle komplett durcheinander ist wenn man nach der ID geht.
    Wie sortiere ich sowas mache ich ein Dataview auf die Tabelle in der ich sortiere?
    Gelesen habe ich auch schon über die BindingSource was, aber soweit ich erkannt habe ich ist diese nicht mit einer ForEach-Schleife durchlaufbar.
    Willkommen im Forum.
    Du arbeitest mit nem tDS. Sehr gut! Das ist schon mal viel wert!

    Die BindingSource nutze ich zum navigieren (Current, Objekt in Zeile X, zum nächsten Element, zum vorherigen Element). Zum direkten Durchsuchen nimm lieber die Tabelle an sich.
    LINQ ist Dein Freund hier:

    VB.NET-Quellcode

    1. Dim PassendeKostentabellenzeilen = DeinTds.Kosten.Where(Function(x) x.MaximalGewicht >= IstGewicht)
    2. Dim GewichtDerPassendenZeile = PassendeKostentabellenzeilen.Select(Function(x) x.MaximalGewicht).Min
    3. Dim DiePassendeKostentabellenzeile = DeinTds.Kosten.First(Function(x) x.MaximalGewicht = GewichtDerPassendenZeile)

    Mit einer passenden Extension, z.B. der vom EdR geht es noch schneller.

    btw: Tabelle "Kosten"? Ich hätte eine Tabelle "Gewichtsklassen" erwartet, weil Kosten sich ja am schnellsten ändern können. Aber es ist ja Dein Datenmodell.

    ##########

    Nochmal was: Es geht natürlich auch anders, sind dann eben mehr Zeilen:

    VB.NET-Quellcode

    1. Private Function GetKostenRowWithLeastFittingWeight(IstGewicht As Double) As DeinTds.KostenRow
    2. Dim KostenRowWithLeastFittingWeight As DeinTds.KostenRow = DeinTds.Kosten.FirstOrDefault
    3. If KostenRowWithLeastFittingWeight Is Nothing Then Return Nothing
    4. For Each KostenRow In DeinTds.Kosten
    5. If KostenRow.MaximalGewicht < IstGewicht Then Continue For
    6. If KostenRow.MaximalGewicht < KostenRowWithLeastFittingWeight.MaximalGewicht Then KostenRowWithLeastFittingWeight = KostenRow
    7. Next
    8. Return KostenRowWithLeastFittingWeight
    9. End Function

    (so aus dem Kopf heraus)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

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