DGV, Spalten berechnen

  • VB.NET

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

    DGV, Spalten berechnen

    Hallo,

    habe ein DGV mit 5 Spalten [ID, Text, Länge, Breite, Radius, QM]

    Nun soll QM direkt bei der Eingabe der Länge und der Breite berechnet werden.
    Die QM wird aber nicht in DB gespeichert- kann mich erinnern irgendwo mal bei euch gelesen zu haben "berechnete Werte gehören nicht in eine DB" ;)

    Habe auch mal hier oder wo anders einen Artikel gesehen, wie ich solche Berechnung machen kann, also innerhlab eines DGV's.

    EDIT:

    Also hatte was vergessen:

    Wenn in Länge und Breite was eingegeben wird, soll daraus = Fläche werden
    Wenn Breite und Länge leer bleibt, soll Radius * p (3,14...) genommen werden = Fläche

    Dachte ich kann das so machen wie im Artikel Berechnen machen, aber da man bei Expression keine Bedingung eingeben kann muß ich es wohl anders machen, sonst wäre es einfach gewesen...

    Ich habs mal so auch Probiert :
    Im DataSetDesginer, im Feld Fläche; Expression mit dem Wert: isnull((W_Laenge * W_Breite), isnull((W_Durchmesser * 3.1459886), 0))

    nur wenn unter Länge und Breite was eingegeben wird berechnet er, bleibt länge und Breite leer und wird ein Wert in W_Durchmesser eingegeben > Ergbenis 0

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

    visual-basic5.de/vbclassic/dotnet/datagridview_calculate.htm


    Wenn in Länge und Breite was eingegeben wird, soll daraus = Fläche werden
    Wenn Breite und Länge leer bleibt, soll Radius * p (3,14...) genommen werden = Fläche

    Tipp:
    1. spalten durchlaufen
    2. inhalt spalten abfragen, ob die spalte leer, dann gewünschte berechnung durchführen. Wenn bestimmte spalte gefüllt mit Werten dann berechneung durchführen.
    Alle diese vorgänge kannst in eine Schleife erledigen.

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

    ich habs mir fast gedacht, dass ich das über's DGV durchlaufen lassen machen muß.
    hab halt gedacht, geht bisserl einfacher mit Expression...

    Ein Versuch war:

    Quellcode

    1. isnull((W_Laenge * W_Breite), 0) OR isnull((W_Durchmesser * 3.1459886), 0)


    Aber das funktioniert nur eingeschränkt.

    Ok... also per Code und durchlaufen ;)


    PS: cooles Bild hast ;)
    PS: cooles Bild hast ;)

    Danke ! :D



    Dachte ich kann das so machen wie im Artikel Berechnen machen, aber da man bei Expression keine Bedingung eingeben kann muß ich es wohl anders machen, sonst wäre es einfach gewesen...

    lösung:
    gssg.de/net_dgvsum.htm

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „SystemUnknow“ ()

    OK, ich gebs heute echt auf--- schlechte Nerven für sowas heute :cursing:

    Ich hab jetzt fast den ganzen NAchmittag damit verbracht den shit hinzubekommen...

    alles mögliche habe ich ausprobiert...

    mein letzter scheiß Versuch schau so aus :
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DGV_Durchdringungen_CellContentClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) _
    2. Handles DachdurchdurchdringungenDataGridView.CellLeave
    3. Try
    4. For z = 0 To DachdurchdurchdringungenDataGridView.Rows.Count - 1
    5. Dim Laenge As Double
    6. Dim Breite As Double
    7. Dim Radius As Double
    8. Dim Uwert As Double
    9. ' Länge
    10. If IsNumeric(DachdurchdurchdringungenDataGridView.Rows(z).Cells(4).Value) = True Then
    11. Laenge = CDbl(DachdurchdurchdringungenDataGridView.Rows(z).Cells(4).Value)
    12. Else
    13. Laenge = 0
    14. End If
    15. ' Breite
    16. If IsNumeric(DachdurchdurchdringungenDataGridView.Rows(z).Cells(5).Value) = True Then
    17. Breite = CDbl(DachdurchdurchdringungenDataGridView.Rows(z).Cells(5).Value)
    18. Else
    19. Breite = 0
    20. End If
    21. ' Radius
    22. If IsNumeric(DachdurchdurchdringungenDataGridView.Rows(z).Cells(6).Value) = True Then
    23. Radius = CDbl(DachdurchdurchdringungenDataGridView.Rows(z).Cells(6).Value)
    24. Else
    25. Radius = 0
    26. End If
    27. ' U-Wert
    28. If IsNumeric(DachdurchdurchdringungenDataGridView.Rows(z).Cells(3).Value) = True Then
    29. Uwert = CDbl(DachdurchdurchdringungenDataGridView.Rows(z).Cells(3).Value)
    30. Else
    31. Uwert = 0
    32. End If
    33. ' Berechnung Fläche
    34. If Laenge > 0 And Breite > 0 Then
    35. Dim Flaeche As Double = Laenge * Breite
    36. Dim Uwert2 As Double = Flaeche * Uwert
    37. DachdurchdurchdringungenDataGridView.Rows(z).Cells(7).Value = Flaeche
    38. DachdurchdurchdringungenDataGridView.Rows(z).Cells(8).Value = Uwert2
    39. U_Wert_berechnen()
    40. Else
    41. If Radius > 0 Then
    42. Dim Flaeche As Double = Math.Pow(Radius, 2) * Math.PI
    43. Dim Uwert2 As Double = Flaeche * Uwert
    44. DachdurchdurchdringungenDataGridView.Rows(z).Cells(7).Value = Flaeche
    45. DachdurchdurchdringungenDataGridView.Rows(z).Cells(8).Value = Uwert2
    46. U_Wert_berechnen()
    47. End If
    48. End If
    49. Next
    50. Catch ex As Exception
    51. End Try
    52. End Sub
    53. Private Sub U_Wert_berechnen()
    54. Dim Sum_UWert As Double
    55. Dim T As Boolean
    56. For z = 0 To DachdurchdurchdringungenDataGridView.Rows.Count - 1
    57. T = IsNothing(DachdurchdurchdringungenDataGridView.Rows(z).Cells(7).Value)
    58. If T = False Then
    59. Sum_UWert += CDbl(DachdurchdurchdringungenDataGridView.Rows(z).Cells(7).Value)
    60. End If
    61. Next
    62. lbl_Suwert.Text = Format(Sum_UWert, "#,##0.00")
    63. End Sub


    Er berechnet immer nur die erste Zeile, die folgenden läßt das scheiß Teil einfach aus.


    Bitte helft mir, heute hat kein laden auf und ich kann mich (nicht schon wieder) eine neue Tastatur kaufen :cursing: :cursing: :cursing:


    EDIT:

    Das Datagridview ist an eine DataTable gebunden

    EDIT:

    so funktionierts auch nicht:

    VB.NET-Quellcode

    1. Private Sub DGV_Durchdringungen_CellContentClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DachdurchdurchdringungenDataGridView.RowLeave
    2. Try
    3. For z = 0 To ProgrammDatenSet.Dachdurchdurchdringungen.Rows.Count - 1
    4. Dim Laenge As Double = CDbl(ProgrammDatenSet.Dachdurchdurchdringungen.Rows(z).Item(4).Value.ToString)
    5. Dim Breite As Double = CDbl(ProgrammDatenSet.Dachdurchdurchdringungen.Rows(z).Item(5).Value.ToString)
    6. Dim Durchmesser As Double = CDbl(ProgrammDatenSet.Dachdurchdurchdringungen.Rows(z).Item(6).Value.ToString)
    7. Dim Uwert As Double = CDbl(ProgrammDatenSet.Dachdurchdurchdringungen.Rows(z).Item(3).Value.ToString)
    8. ' Berechnung Fläche
    9. If Laenge > 0 And Breite > 0 Then
    10. Dim Flaeche As Double = Laenge * Breite
    11. Dim Uwert2 As Double = Flaeche * Uwert
    12. ProgrammDatenSet.Dachdurchdurchdringungen.Rows(z).Item(7).Value = Flaeche
    13. ProgrammDatenSet.Dachdurchdurchdringungen.Rows(z).Item(8).Value = Uwert2
    14. 'U_Wert_berechnen()
    15. Else
    16. If Durchmesser > 0 Then
    17. Dim Flaeche As Double = Math.Pow(Durchmesser, 2) * Math.PI
    18. Dim Uwert2 As Double = Flaeche * Uwert
    19. ProgrammDatenSet.Dachdurchdurchdringungen.Rows(z).Item(7).Value = Flaeche
    20. ProgrammDatenSet.Dachdurchdurchdringungen.Rows(z).Item(8).Value = Uwert2
    21. 'U_Wert_berechnen()
    22. Else
    23. MsgBox("so eine scheiße")
    24. End If
    25. End If
    26. Next
    27. Catch ex As Exception
    28. MsgBox(ex.Message)
    29. End Try
    30. End Sub


    Da kommt so ne scheiß Meldung wie: Der öffentliche Member für Double wurde nicht gefudne"...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „lris08“ ()

    lris08 schrieb:

    Er berechnet immer nur die erste Zeile, die folgenden läßt das scheiß Teil einfach aus.

    also wenn man so lernresistent ist, dann kann man da auch nicht wirklich helfen. AvoidTryCatch - empfehle ich dir doch nicht zum ersten mal, oder doch?

    Und natürlich werdich wieder ignoriert, weil ich empfehle ja das IIF-Konstrukt der DataExpression - das ginge ja ganz ohne code. Aber die allgemeine VBP-Deppen-Devise zu jeglichem neuen Denkansatz lautet ja auch: "Ignorieren statt Recherchieren (oder gar nachfragen)"

    Und sowas:

    VB.NET-Quellcode

    1. Dim Breite As Double = CDbl(ProgrammDatenSet.Dachdurchdurchdringungen.Rows(z).Item(5).Value.ToString)
    ist einfach zum Heulen.
    Mir scheint, typisiertes Dataset ist zu gut für dich.

    CDBL(.Item.Value.ToString()) - also da kriegich Schreikrämpfe von.
    Da kannste Option Strict auch wieder Off machen - hat eh kein Zweck.

    Es heißt:

    VB.NET-Quellcode

    1. Dim Breite As Double = ProgrammDatenSet.Dachdurchdurchdringungen(z).Breite

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

    also wenn man so lernresistent ist, dann kann man da auch nicht wirklich helfen. AvoidTryCatch - empfehle ich dir doch nicht zum ersten mal, oder doch?

    doch das lese ich zum ersten mal ... ^^

    Dim Breite As Double = ProgrammDatenSet.Dachdurchdurchdringungen(z).Breite

    Jetzt hab ich es kapiert... ich denk immer bei .value.tostring ich füll nur eine Textbox oder... Entschuldigung... ;(

    Jetzt habe ich es so... und funktioniert schon mal :) wieder ein mal DANKE :love:

    VB.NET-Quellcode

    1. Private Sub DGV_Durchdringungen_CellContentClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DachdurchdurchdringungenDataGridView.RowLeave
    2. Try
    3. For z = 0 To ProgrammDatenSet.Dachdurchdurchdringungen.Rows.Count - 1
    4. Dim Laenge As Double = ProgrammDatenSet.Dachdurchdurchdringungen(z).W_Laenge
    5. Dim Breite As Double = ProgrammDatenSet.Dachdurchdurchdringungen(z).W_Breite
    6. Dim Durchmesser As Double = ProgrammDatenSet.Dachdurchdurchdringungen(z).W_Durchmesser
    7. Dim Uwert As Double = ProgrammDatenSet.Dachdurchdurchdringungen(z).W_UWert
    8. ' Berechnung Fläche
    9. If Laenge > 0 And Breite > 0 Then
    10. Dim Flaeche As Double = Laenge * Breite
    11. Dim Uwert2 As Double = Flaeche * Uwert
    12. ProgrammDatenSet.Dachdurchdurchdringungen(z).W_e_Flaeche = Flaeche
    13. ProgrammDatenSet.Dachdurchdurchdringungen(z).W_e_KorUWert = Uwert2
    14. 'U_Wert_berechnen()
    15. Else
    16. If Durchmesser > 0 Then
    17. Dim Flaeche As Double = Math.Pow(Durchmesser, 2) * Math.PI
    18. Dim Uwert2 As Double = Flaeche * Uwert
    19. ProgrammDatenSet.Dachdurchdurchdringungen(z).W_e_Flaeche = Flaeche
    20. ProgrammDatenSet.Dachdurchdurchdringungen(z).W_e_KorUWert = Uwert2
    21. 'U_Wert_berechnen()
    22. Else
    23. MsgBox("so eine scheiße")
    24. End If
    25. End If
    26. Next
    27. Catch ex As Exception
    28. MsgBox(ex.Message)
    29. End Try
    30. End Sub


    Jetzt noch eine Fragen bitte:

    1.) Ist das so

    VB.NET-Quellcode

    1. Private Sub DGV_Durchdringungen_CellContentClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DachdurchdurchdringungenDataGridView.RowLeave
    richtig, Berechnungen werden nur angestellt, wenn ich erst von links nach rechts die Dateneingegeben habe, per TabStop weiter... usw. und dann enter drücke... so richtig?

    und jetzt schau ich mir das mit try an... 8|
    Bin ja noch am Testen...
    Also Namen habe ich gändert :)


    Den Code habe ich nun geändert...
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DGV_Durchdringungen_Berechnen(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DachdurchdurchdringungenDataGridView.RowLeave
    2. For z = 0 To ProgrammDatenSet.Dachdurchdurchdringungen.Rows.Count - 1
    3. Dim Laenge As Double = ProgrammDatenSet.Dachdurchdurchdringungen(z).W_Laenge
    4. Dim Breite As Double = ProgrammDatenSet.Dachdurchdurchdringungen(z).W_Breite
    5. Dim Durchmesser As Double = ProgrammDatenSet.Dachdurchdurchdringungen(z).W_Durchmesser
    6. Dim Uwert As Double = ProgrammDatenSet.Dachdurchdurchdringungen(z).W_UWert
    7. ' Berechnung Fläche
    8. If Laenge > 0 And Breite > 0 Then
    9. Dim Flaeche As Double = Laenge * Breite
    10. Dim Uwert2 As Double = Flaeche * Uwert
    11. ProgrammDatenSet.Dachdurchdurchdringungen(z).W_e_Flaeche = Format(Flaeche, "#,##0.00")
    12. ProgrammDatenSet.Dachdurchdurchdringungen(z).W_e_KorUWert = Format(Uwert2, "#,##0.00")
    13. U_Wert_berechnen()
    14. Else
    15. If Durchmesser > 0 Then
    16. Dim Flaeche As Double = Math.Pow(Durchmesser, 2) * Math.PI
    17. Dim Uwert2 As Double = Flaeche * Uwert
    18. ProgrammDatenSet.Dachdurchdurchdringungen(z).W_e_Flaeche = Format(Flaeche, "#,##0.00")
    19. ProgrammDatenSet.Dachdurchdurchdringungen(z).W_e_KorUWert = Format(Uwert2, "#,##0.00")
    20. U_Wert_berechnen()
    21. Else
    22. ProgrammDatenSet.Dachdurchdurchdringungen(z).W_e_Flaeche = Format(0, "#,##0.00")
    23. ProgrammDatenSet.Dachdurchdurchdringungen(z).W_e_KorUWert = Format(0, "#,##0.00")
    24. End If
    25. End If
    26. Next
    27. End Sub


    Beim Ausführen kommt Fehlermeldung - siehe Bild:

    In der Eingabezeile im DGV, gebe ich länge und breite an wird fläöche gerechnet, wird Durchmesser auch eingegeben wird fläche durch

    Quellcode

    1. Math.Pow(Durchmesser, 2) * Math.PI
    überschrieben.
    Weil man hat nicht immer länge x breite sonder mal auch nur ein Rohr... :) :wacko:
    Bilder
    • VB_3.jpg

      181,88 kB, 1.106×455, 107 mal angesehen
    auch hier wieder unklar, was die Frage soll: Wenn kein Durchmesser angegeben ist, kannst du auch nicht die Durchmesser-Formel in Anschlag bringen - freu dich über die Fehlermeldung, und dass du den TryCatch weggemacht hast.

    Verwende die IsDBNullDurchmesser() - Methode deines Datasets zum Testen, ob ein Wert drinne ist, und guck dir zum Kuckuck endlich mal dein Dataset im ObjectBrowser an

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

    ein Double kann nicht Nothing sein - das ist ein Wert-Typ.
    Aber um das zu verstehen, müsstest du ühaupt mal die Sprache VB.Net erlernen: dieses Buch Lesen (empfehle ich dir auch nicht zum ersten mal, oder?)

    Hey - Post#5000

    (Mist - ich wollte eiglich bis Mitternacht warten ;))