DGV: Keine doppelten Werte in der Summe

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Sabine.

    DGV: Keine doppelten Werte in der Summe

    Hallo zusammen,

    In ein DGV sollen Daten in ein Array eingelesen werden. Mit diesem Array sollen die verschiedene Summen berechnet und in einer Messagebox angezeigt werden. Bei folgender Summe komme ich nicht weiter:
    Summe aller Zahlen für die folgendes gilt
    • Sobald in der Reihe die Zahl 10 auftaucht, wird die aktuelle Zahl und die nächsten zwei Zahlen zu der Summe hinzuaddiert
    • Keine Zahl darf zu der Summe doppelt hinzugefügt werden
    Den ersten Teil kriege ich hin, nur weiß ich nicht, wie ich Duplikate in der Summe verhindere

    VB.NET-Quellcode

    1. Private Sub BTN_Click(sender As Object, e As EventArgs) Handles BTN.Click
    2. Dim Anzahlzeilen As Integer
    3. Anzahlzeilen = DGVData.RowCount
    4. Dim Zeile() As Double = New Double(Anzahlzeilen - 1) {}
    5. For i As Integer = 0 To Anzahlzeilen - 1
    6. Zeile(i) = CDbl(DGVData.Rows(i).Cells(0).Value)
    7. Next i
    8. Dim Ergebnis4 As Double
    9. Ergebnis4 = 0
    10. For i As Integer = 0 To Anzahlzeilen - 1
    11. If Zeile(i) = 10 Then
    12. Ergebnis4 += Zeile(i) + Zeile(i + 1) + Zeile(i + 2)
    13. End If
    14. Next i

    Ich hoffe jemand kann mir hier weiterhelfen :)
    Vielen Dank und liebe Grüße
    Sabine
    @Sabine Ebenfalls ein Willkommen im Forum. :thumbsup:
    Du musst einmal sicherstellen, dass bereits der Übertragung des DGV in das Array die Dubletten eliminiert werden,
    zum anderen musst Du testen, dass bei Vorhandensein eines Wertes 10 danach tatsächlich noch 2 Elemente da sind.
    Hier ergeben sich folgende Fragen:
    • Was ist zu tun, wenn nach einer 10 nicht noch 2 Zeilen da sind?
    • Was ist zu tun, wenn nach einer 10 eine weitere 10 folgt?
    • Du arbeitest mit Double-Werten. Durch "numerische Dreckeffekte" kann es vorkommen, dass sich 2 Werte in der 13. Stelle unterscheiden, die logisch gleich wären.
      Dies solltest Du auch abtesten.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Anzahlzeilen As Integer= DGVData.RowCount
    3. Dim Zeilen As List(Of Double) = New List(Of Double)
    4. For i As Integer = 0 To Anzahlzeilen - 1
    5. Dim value = CDbl(DGVData.Rows(i).Cells(0).Value)
    6. If Not Zeilen.Contains(value) Then
    7. Zeilen.Add(value)
    8. End If
    9. Next i
    10. Dim Ergebnis4 As Double
    11. Ergebnis4 = 0
    12. For i As Integer = 0 To Zeilen.Count - 1
    13. If Zeilen(i) = 10 Then
    14. Ergebnis4 += Zeilen(i) + Zeilen(i + 1) + Zeilen(i + 2)
    15. End If
    16. Next i
    17. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Sabine , @VB1963 Danke, dass Ihr Post #3 überlesen habt. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @VB1963 OK. :D
    Dieses Muster kann natürlich nur da sein, wenn die Dublette bei der Übertragung vom DGV nach Array=>List nicht bereits rausgeworfen wurde.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Hihi, hab ich mir auch gedacht ^^

    Also ich würde da anders rangehen, speicher haben wir ja genug heutzutage.. also schön in einer List (Of Double) alles mitspeichern und beim Durchgang überprüfen, ob der Wert schon drin ist. Woher der Wert kommt, wissen wir ja atm nicht. (Evtl. könnte man das schon vorher Regeln?)

    @Sabine ; Habe hier mal ein Beispiel gemacht- Angenommen die Spalte beinhaltet 3 | 5 | 3 |15 | 3 würdest du das Ergebnis 23 erhalten. Hoffe das ist richtig- du willst ja sicherlich alle, mehrmals vorkommende Werte, überspringen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim valTotal As Double = 0
    2. Dim listVals As New List(Of Double)
    3. For Each rrow As DataGridViewRow In DataGridView1.Rows
    4. Dim val As Double = Convert.ToDouble(rrow.Cells(0).Value) 'Spaltenindex hier abändern
    5. If val <> Nothing Then 'Wenn die Zelle leer, dann...
    6. If Not listVals.Contains(val) Then 'Wenn die Liste den Wert 'val' noch nicht beinhaltet, dann..
    7. valTotal += val 'Auf unsere Summe den Wert 'val' rechnen
    8. End If
    9. Else
    10. MessageBox.Show("nix drin in der zelle") 'Nix in der Zelle, also nix machen.
    11. End If
    12. listVals.Add(val) 'für jeden Durchgang den Wert 'val' hinzufügen
    13. Next
    14. MessageBox.Show("Summe der Spalte: " & valTotal.ToString)

    Option Strict On!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Drahuverar“ ()

    @VB1963 Das sind Anregungen von uns, die @Sabine bedenken muss.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!