Datumsberechnungen in der Datacolumn.Expression-Eigenschaft

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Datumsberechnungen in der Datacolumn.Expression-Eigenschaft

    Hallo Community!
    Wie berechnet man in der System.Data.Datacolumn.Expression-Eigenschaft eine Datumsdifferenz
    wie zum Beispiel bei den Spalten: Ankunfszeit - Abflugszeit wäre die Flugzeit :?: ...funktioniert aber so nicht!
    Nach Beschreibung der Syntax kann ich da aber auch leider nichts finden...
    Eine viel einfachere Lösung:

    VB.NET-Quellcode

    1. Private Sub ArtikelDataGridView_CellFormatting(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs) Handles ArtikelDataGridView.CellFormatting
    2. With ArtikelDataGridView
    3. If .Columns(e.ColumnIndex) IsNot DoublePriceColumn Then Return
    4. Dim drv = DirectCast(.Rows(e.RowIndex).DataBoundItem, DataRowView)
    5. If drv Is Nothing Then Return
    6. Dim rwArticle = DirectCast(drv.Row, ArtikelRow)
    7. e.Value = rwArticle.Preis * 2
    8. End With
    9. End Sub
    Im Designer habich eine ungebundene TextColumn namens DoublePriceColumn zugefügt, und in diesem CellFormatting-Event verpasse ich ihr einen berechneten Wert.

    Dassis sehr cool, denn so kann ich auch auf 2-fach übergeordnete DataTables zugreifen und so Zeugs.
    Danke sehr interessant, werde ich gleich ausprobieren ... die Berechnung spielt sich im Datagridview ab.
    Ich habe momentan dieses gemacht:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Partial Class FluegeDts
    2. Partial Class FluegeDataTable
    3. Private Sub FluegeDataTable(sender As System.Object, e As FluegeRowChangeEvent) Handles Me.FluegeRowChanged
    4. If e.Action = DataRowAction.Add Then
    5. If e.Row.IsAbflugNull Then Return
    6. If e.Row.IsGelandetNull Then
    7. e.Row.Flugzeit = (Now - e.Row.Abflug).TotalSeconds / 86400
    8. Else
    9. e.Row.Flugzeit = (e.Row.Gelandet - e.Row.Abflug).TotalSeconds / 86400
    10. End If
    11. End If
    12. End Sub
    13. End Class
    14. End Class
    Hier wird die Berechnung mit TableEvent RowChanged bei e.Action = DataRowAction.Add gemacht.
    Wenn man in der übergeordneten Tabelle in der herkömmlichen DataColumn.Expression-Eigenschaft die Flugzeiten summiert.
    IsNull(Sum(Child(FK_Flugzeug_Fluege).Flugzeit),0) ... habe ich probiert.
    Das geht überraschenderweise einwandfrei und habe die Berechnung in der Tabelle.
    Ja, da hast du recht...
    da muss man noch das e.Action = DataRowAction.Change berücksichtigen
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Partial Class FluegeDts
    2. Partial Class FluegeDataTable
    3. Private Sub FluegeDataTable(sender As System.Object, e As FluegeRowChangeEvent) Handles Me.FluegeRowChanged
    4. If e.Action = DataRowAction.Add OrElse e.Action = DataRowAction.Change Then
    5. If e.Row.IsAbflugNull Then Return
    6. RemoveHandler Me.FluegeRowChanged, AddressOf FluegeDataTable
    7. If e.Row.IsGelandetNull Then
    8. e.Row.Flugzeit = (Now - e.Row.Abflug).TotalSeconds / 86400
    9. Else
    10. e.Row.Flugzeit = (e.Row.Gelandet - e.Row.Abflug).TotalSeconds / 86400
    11. End If
    12. AddHandler Me.FluegeRowChanged, AddressOf FluegeDataTable
    13. End If
    14. End Sub
    15. End Class
    16. End Class
    dann geht das auch.
    Die Handler-Geschichte braucht man, sonst hängt sich die Berechnung auf...