DataExpressions - benutzerdefinierte Funktionen

  • VB.NET

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

    DataExpressions - benutzerdefinierte Funktionen

    Hallo Community!

    Gibt es eine Möglichkeit, bei Dataset-Expression mit selbstgebauten Funktionen zu arbeiten :?:
    Ich habe diesbezüglich mit Google nichts finden können...
    Probiere momentan mit dem TableRowChanged-Ereignis herum :whistling:

    VB1963 schrieb:

    Gibt es eine Möglichkeit, bei Dataset-Expression mit selbstgebauten Funktionen zu arbeiten?
    Erklär dich mal genauer.

    Also ich verstehe das so, dass man sich wünscht, einem DataView oder einer BindingSource einen Predicate-Delegaten zu übergeben, anhand dessen die Daten gefiltert werden könnte.
    Also ähnlich, wie die Linq-ErweiterungsFunktion Where(predicate as Func(Of TItem, Boolean)), mit der man ja typisierte Auflistungen (List(Of TItem)) filtern kann.

    Hat BindingSource und DataView leider nicht :(
    vlt. könnteman was probieren mit den Wpf-CollectionViews - ob man die als Ersatz für BindingSource verwenden kann. Ist aber ein sehr experimenteller Ansatz ;)
    nein.
    Diese Syntax ist eine Art "embedded language", wie etwa auch Regex oder Sql: Es wird Code in einen String geschrieben, und dieser String wird iwie kompiliert oder interpretiert - jdfs ausgeführt.
    Und natürlich kannst du keinen Vb-Code schreiben, der den Funktions-Umfang einer embedded language erweitert.

    Ups! Prinzipiell kann man das doch - jdfs. bei Regex ist möglich, dass während der Verarbeitung CallbackMethoden aufgerufen werden.
    Tja - bei DataExpressions eben nicht :(
    Danke!
    Schade, ich habe es mir an den Googleergebnissen ja fast schon denken können.

    Ich fand im Dataset bei den Table-Events einen Ausweg, der zumindest eine
    zeilenweise benutzdefinierte Berechnung der hinzugefügten Columns zulässt.
    Siehe Beispiel im Expander.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Partial Class BeispielDts
    2. Partial Class SortenKatalogDataTable
    3. Private Sub Tabelle_RowChanged(sender As System.Object, e As SortenKatalogRowChangeEvent) Handles Me.SortenKatalogRowChanged
    4. If e.Action = DataRowAction.Change Then Return
    5. Dim sk = New SortKey
    6. sk.SetSortKey(CULng(e.Row.KatalogID))
    7. e.Row.PM = CInt(sk.PM)
    8. e.Row.Technologie = CInt(sk.TechNummer)
    9. e.Row.Farbe = CInt(sk.FarbCode)
    10. e.Row.Grammatur = CInt(sk.Grammatur)
    11. End Sub
    12. End Class
    13. End Class

    Ich glaube, dass hier noch mehr möglich ist ...
    kapiere nix von dem Sample, weil ich die SortKey-Klasse nicht kenne.

    Allerdings dürfte es Ereignisketten auslösen, innerhalb des _RowChanged, die Row nochmal zu changen.

    Wie sich das auf Filter und Sortierung auswirkt - k.A. Weil dassis ja eiglich das Metier der DataExpressions.
    Dieses Beispiel soll zur Veranschaulichung dienen und zeigen, wie man nach Zeile 4
    Berechnungen an den einzelnen Columns (e.Row.xxx) in der Tabelle vornehmen kann.
    ...gebe zu, da ist diese unbekannte SortKey-Struktur nicht gerade die beste Wahl gewesen. ;)
    Ja, und ohne der Zeile 4 bleibt das Beispiel in einer Ereigniskette hängen! :!:
    Ich habe diese Zeile jetzt verbessert und abgeändert:

    VB.NET-Quellcode

    1. If e.Action <> DataRowAction.Add Then Return
    Ich will diese Berechnungen eigentlich nur beim Tabellenaufbau im DGV durchführen,
    damit die datenungebundenden Spalten (e.Row.PM, e.Row.Technologie, e.Row.Farbe, e.Row.Grammatur)
    an hand der datenhaltenden Spalte (e.Row.KatalogID) berechnet werden, sonst bleiben die Zellen ja beim Tabellenaufbau leer.
    Änderungen während der Dateneingabe in der aktuellen Zeile können mit der Bindingsource abgehandelt werden.

    Probleme mit Filtern und Sortieren habe ich bis jetzt nicht feststellen können ...

    ...glaube jetzt, dass hier dann nicht mehr möglich sein wird, gibt sicher bessere Verfahren :?:

    Nachsatz zu DataExpressions - benutzerdefinierte Funktionen

    Hallo!
    Ohne eine Ereigniskette bei Datenänderungen in der aktuellen Zeile zu produzieren, kann man wie folgt vorgehen...
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Partial Class QuersummenDts
    2. Partial Class QuersummenDataTable
    3. Private Sub tbl_RowChanged(sender As System.Object, e As QuersummenRowChangeEvent) Handles Me.QuersummenRowChanged
    4. If e.Action = DataRowAction.Add OrElse e.Action = DataRowAction.Change Then
    5. RemoveHandler Me.QuersummenRowChanged, AddressOf tbl_RowChanged
    6. '
    7. 'Hier werden die Zellen berechnet
    8. '
    9. AddHandler Me.QuersummenRowChanged, AddressOf tbl_RowChanged
    10. End If
    11. End Sub
    12. End Class
    13. End Class
    Man kann damit aber nur zeilenweise Berechnungen beliebiger Art durchführen.
    Wenn es interessiert, ich habe ein Beispielsample angehängt...
    Dateien