Best Practice Filtern DataTable

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von rgomez.

    Best Practice Filtern DataTable

    Guten Abend,

    schreibe gerade ein kleines Programm die Kundenkontakte aus einer DB anzeigt. Die User sollen die möglichkeit nach Kundengruppe und -status zu filtern, aber auch nach Land, nach PLZ und nach Umsatz.

    Ich habe eig. kein Problem nur ein Teil meines Codes kommt mir zu "Spaghetti" vor, und bin sicher es gibt eine bessere, elegantere Lösung und deshalb frage mal in die Runde nach Tipps/Verbesserungsvorschläge.

    Hier den Code zu einer der Filtermethoden. Es muss erkennen ob es schon ein Filter vorhanden ist (z.B Land oder PLZ)und wenn vorhanden, dann den gewünschten neuen Filter mit einer 'AND'-Verknüpfung "addieren". Ist der Filter leer dann einfach den Filter setzen.
    Bisher habe ich BindingSource.FIlter benutzt, ist das überhaupt die beste Idee.

    Hier den Code :)

    VB.NET-Quellcode

    1. Private Sub TsDdBtnFilterKGruppe_Click(sender As Object, e As EventArgs) Handles TsDdBtnFilterKGruppe.Click
    2. Dim dialog As New MFormFilterKGruppe()
    3. Dim result As DialogResult = dialog.ShowDialog(Me)
    4. If result = DialogResult.OK Then
    5. If dialog.FilterType = "Kundengruppe" Then
    6. If Not String.IsNullOrEmpty(AdrKommBindingSource.Filter) Then
    7. AdrKommBindingSource.Filter += $" AND KGruppe='{dialog.KGruppe}'"
    8. Else
    9. AdrKommBindingSource.Filter += $"KGruppe='{dialog.KGruppe}'"
    10. End If
    11. ElseIf dialog.FilterType = "Kundenstatus" Then
    12. If Not String.IsNullOrEmpty(AdrKommBindingSource.Filter) Then
    13. AdrKommBindingSource.Filter += $" AND KStatus='{dialog.KStatus}'"
    14. Else
    15. AdrKommBindingSource.Filter += $"KStatus='{dialog.KStatus}'"
    16. End If
    17. Else
    18. AdrKommBindingSource.Filter += $"KGruppe='{dialog.KGruppe} AND KStatus={dialog.KStatus}'"
    19. End If
    20. End If
    21. dialog.Dispose()
    22. End Sub


    Danke im Voraus und schönen Abend noch
    Life doesn't give you a datasheet. Sometimes the docs are wrong and you have to try it.

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

    Ich gebe zu, dass ich jetzt erstmal nur ne String-Zusammensetz-Geschichte sehe => ggf. Text.StringBuilder verwenden.
    Mach doch einfach generell ein If Not String.IsNullOrEmpty(AdrKommBindingSource.Filter) Then AdrKommBindingSource.Filter += " AND " und danach den entsprechenden Filterstring immer dran, denn der einzige Unterschied ist doch immer nur das "And".
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    ich kann dir nur bestätigen: Komplexe Filter für die BindingSource.Filter-Property ist extrem kompliziert.
    Also wenn ein GesamtFilter-Ausdruck entstehen soll, der aus mehreren FilterSegmenten besteht, deren jedes einen Vergleich auf eine annere Spalte ausführt - sowas:

    VB.NET-Quellcode

    1. bs.Filter = "((Name like '*mann') And (RoleID in (2,3,6)) And (Datum > #9/11/2001# And Datum < #12/24/2001#)"
    Und dann sollen FilterSegmente auch noch zu - und wegschaltbar sein...

    Haste ja schon gemerkt: Ein Hauptproblem ist, dass das Anwenden des einen Segmentes nicht die anderen Segmente Überschreiben darf.
    hab ich eine recht komplizierte Bibliothek zu verzapft, aber würdich lieber nicht veröffentlichen, weil zum einen kompliziert inne Anwendung und zum anderen noch immer unausgegoren.

    Nur Tipp: Bilde die FilterAusdrücke nicht direkt auf der BindingSource-Property.
    Lies den bestehenden Filter in eine Variable, analysiere, welche Segmente bereits da sind, bastel die neuen Segmente zusammen, pack das in die Variable, und erst gaaanz zuletzt

    VB.NET-Quellcode

    1. bs.Filter = sFilterNew
    oder

    VB.NET-Quellcode

    1. bs.Filter = String.Join(" AND ", filterSegments)
    So könnteste zB alle Segmente ver-unden.

    VaporiZed schrieb:

    Ich gebe zu, dass ich jetzt erstmal nur ne String-Zusammensetz-Geschichte sehe => ggf. Text.StringBuilder verwenden.
    Mach doch einfach generell ein If Not String.IsNullOrEmpty(AdrKommBindingSource.Filter) Then AdrKommBindingSource.Filter += " AND " und danach den entsprechenden Filterstring immer dran, denn der einzige Unterschied ist doch immer nur das "And".


    Das war genau mein erster Ansatz, aber der Compiler meckert bei AdrKommBindingSource.Filter += " AND ", weil (klar, nacher ist man immer schlauer :P) in diesem Moment hat den Filter keine richtige SQL Syntax, da den Filter mit 'AND' endet.

    @ErfinderDesRades, danke für den Tipp, werde ich folgen und danke für die Bestätigung, dass ich nicht dumm bin, sondern die Sache kompliziert ist :)
    Life doesn't give you a datasheet. Sometimes the docs are wrong and you have to try it.