DataTable multiple Filter

  • VB.NET

SSL ist deaktiviert! Aktivieren Sie SSL für diese Sitzung, um eine sichere Verbindung herzustellen.

Es gibt 56 Antworten in diesem Thema. Der letzte Beitrag () ist von Sam85.

    DataTable multiple Filter

    Hallo,

    ich möchte einen DataTable mit mehreren Filtern versehen (bis jetzt sind es 6) soweit so gut. (Filtersubjekt steht in ComboBox und TextBox)
    Nun wollte ich natürlich die Verknpüfung sauber hinbekommen..bis jetzt bin ich mir aber nicht sicher welches Event dafür am besten geeignet ist.
    Derzeit steuer ich auf eine TextBox die mit den Filtern verbunden ist, dachte aber ich frag mal ob es dafür auch bessere Alternativen gibt, um alle miteinander zu verbinden ohne viele aufwendige IF Funktionen zu verwenden.
    Sollte das jedoch der einzige Weg sein, freue mich natürlich auch über die Bestätigung dazu. :)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub mtb_search_TextChanged(sender As Object, e As EventArgs) Handles mtb_name.TextChanged, mcb_bereich.TextChanged, mcb_kasse.TextChanged, mcb_klasse.TextChanged, mcb_pg.TextChanged, mcb_körper.TextChanged
    2. Dim suchname As String = mtb_name.Text
    3. Dim suchbereich As String = mcb_bereich.Text
    4. Dim suchkasse As String = mcb_kasse.Text
    5. Dim suchklasse As String = mcb_klasse.Text
    6. Dim suchpg As String = mcb_pg.Text
    7. Dim suchkörper As String = mcb_körper.Text
    8. Dim filter1 As String = "Bezeichnung Like'" & suchname & "*'"
    9. Dim filter2 As String = "Produktgruppe Like'" & suchpg & "*'"
    10. Dim filter3 As String = "Produktbereich Like'" & suchbereich & "*'"
    11. Dim filter4 As String = "Produktklasse Like'" & suchklasse & "*'"
    12. Dim filter5 As String = "Körperbereich Like'" & suchkörper & "*'"
    13. Dim filter6 As String = "Kasse Like'" & suchkasse & "*'"
    14. If suchpg <> "" And suchkasse <> "" And suchklasse <> "" And suchbereich <> "" And suchkörper <> "" And suchname <> "" Then
    15. OrthesenDTBindingSource.Filter = filter2 & " AND " & filter6 & " AND " & filter4 & " AND " & filter3 & " AND " & filter5 & " AND " & filter1
    16. ElseIf suchpg <> "" And suchkasse <> "" And suchklasse <> "" And suchbereich <> "" And suchkörper <> "" Then
    17. OrthesenDTBindingSource.Filter = filter2 & " AND " & filter6 & " AND " & filter4 & " AND " & filter3 & " AND " & filter5
    18. ElseIf suchpg <> "" And suchkasse <> "" And suchklasse <> "" And suchbereich <> "" Then
    19. OrthesenDTBindingSource.Filter = filter2 & " AND " & filter6 & " AND " & filter4 & " AND " & filter3
    20. ElseIf suchpg <> "" And suchkasse <> "" And suchklasse <> "" Then
    21. OrthesenDTBindingSource.Filter = filter2 & " AND " & filter6 & " AND " & filter4
    22. ElseIf suchpg <> "" And suchkasse <> "" Then
    23. OrthesenDTBindingSource.Filter = filter2 & " AND " & filter6
    24. ElseIf suchpg <> "" Then
    25. OrthesenDTBindingSource.Filter = filter2
    26. Else
    27. MessageBox.Show("Bitte das Auswahlkriterium anpassen!")
    28. End If




    Freue mich über Feedback.

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

    Dreh das ganze um und pack immer was per AND hinzu:

    VB.NET-Quellcode

    1. If suchpg <> "" Then OrthesenDTBindingSource.Filter = filter2
    2. If suchkasse <> "" Then OrthesenDTBindingSource.Filter &= " AND " & filter6
    3. 'usw.

    Am Ende ein ggf. führendes AND noch rauslöschen.
    Oder erstmal alles in einen StringBuilder packen und zum Schluß dem Filter zuordnen.
    Oder alle Filterkandidaten zu einem Array packen und diese am Ende mit einem String.Join kombinieren.
    • meine wichtigste Programmiererkenntnis: Mühsam erhängt sich das Eichhörnchen.
    • eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    • »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder, wenn es kein Besteck mehr gibt, zumindest Glasnudeln.«
    • If Not GrammarIsOk() Then AssumeThatCodeIsOk = False

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

    Mit Linq muss ich mich erstmal auseinandersetzen, das andere hat gut funktioniert :). Dankeschön.
    Nun hab ich noch eine Frage.

    Wenn nun der DataTable gefiltert wird, sollten ja theoretisch auch die Auswahlkriterien der anderen Filter reduziert werden (in der ComboBox). Worauf muss ich achten, damit das auch passiert? Bisher bleiben einfach alle Kriterien (in der ComboBox) bestehen auch wenn der Filter sie im DGV (bzw. im DataTable) aussortiert hat?!
    Wenn du verschiedene Controls an die gleiche Tabelle bindest, kommt es darauf an welche BindingSource du den Controls zwischen schiebst...
    Ich gehe jetzt davon aus, dass die Filterung der Daten über die Filter-Eigenschaft der BS abläuft...
    ​Wenn du die gleiche BS bei den Controls verwendest, dann wird überall gleich gefiltert...
    Nimmst du für jedes Control eine eigene BS, dann verhält sich der die Filterung nach deren Filter-Eigenschaft...

    Neu

    @VB1963
    wenn ich dich jetzt richtig verstehe, dann benötige ich für jedes Control eine BindingSource? Insgesamt habe ich aber nur eine BS, wie arrangiere ich mich damit bzw. kann ich damit überhaupt so ein Ergebnis erzielen?

    Neu

    Ja du musst das DGV getrennt zur Combobox filtern, wenn du verschiedene Filterergebnisse in den Controls haben möchtest - d.h. verschiedene BS, damit du deren .Filter-Eigenschaften verschieden setzen kannst...
    P.S. man filtert nicht in der Datatable sondern in der BS oder mittels LINQ und erstellt sich damit eine sortierte DataView, wie @KBT oben schon erwähnte...

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

    Neu

    Mit dem Umgang einer BS weis ich im Moment kein spezielles TUT. Schaue dazu einmal hier im Forum unter der Rubrik Datenbanken. Da hat ErfindetDesRades viele gute Tuts verfasst.

    msdn.microsoft.com/de-de/libra…dingsource(v=vs.110).aspx

    Im Grunde suchst du eigentlich ein spezielles DGV, das mehrere Spaltenfilter setzen kann, wenn ich mich nicht irre:
    DataGridViewEx - DataGridView mit eingebautem Filter
    (von @us4711)

    Neu

    Ja genau so in der Art wenn das dafür sorgt, das wenn ich den einen Filter setze der nächste Filter sich automatisch begrenzt dann ist es das was ich suche.

    EDIT: Das DataGridViewEx ist wirklich sehr gut aber es reagiert stark verzögert, liegt das an der Datenmenge?

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

    Neu

    @us4711
    Sobald ich im Filter anfange etwas einzutippen, verzögert sich die Übertragung. Stark verzögert im Vergleich zum BindingSourceFilter. Wenn man da von stark sprechen kann, beim BSFilter ist keine fühlbare Verzögerung.

    Neu

    Das DataGrid von DevExpress kann auch pro Spalte Filtern. Die machen das direkt in der DataSource, nicht auf DB Ebene.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Neu

    @Sam85
    Na ja, die Filter von DataGridViewEx wirken auf die Filter-Property der als DataSource angeschlossenen BindingSource.
    Bei jedem Zeichen, das in die Filter-Textbox einer DGV-Column eingegeben wird, wird dieser Filter von Spalte zu Spalte neu aufgebaut, und an die Bindingsource weitergereicht.
    Ich habe auf meinem System zur Füllung einer Tabelle in einem typ. Dataset einen Testdatengenerator installiert. In der Tat fängt da DGVEx ab ca. 1500 Datensätzen und ca. 30 Spalten, verzögert zu reagieren, etwa im1/10 Sec. Bereich. Das ist für mich ausreichend.

    Neu

    Kann es sein, dass einer von diesen Threads auf meine Fragestellung irgendwie zutrifft?

    Datagridview mit gefilterter Bindingsource Spaltenwerte ändern

    DataGridView filtern mit mehreren Comboboxen

    Comboboxen zeigen identischen Inhalt

    EDIT:

    Also ich bin mir nicht sicher ob mein Ansatz so vernünftig ist, von daher meine Rückfrage ob das Vorgehen Sinn macht?

    So sieht die Quelle für die ComboBox bisher aus (ungefiltert)

    VB.NET-Quellcode

    1. mcb_kasse.DataSource = OrthesenDS.OrthesenDT.Select(Function(x) x.Kasse).Distinct.OrderBy(Function(x) x).ToList


    Und so war mein Gedanke bzw. Versuch die ComboBox nur noch mit den gefilterten Ergebnissen zu füllen..(bisher erstmal ohne das distinct und orderby).
    Geht das am Ziel vorbei? (abgesehen davon das es nicht funktioniert)

    VB.NET-Quellcode

    1. Dim kassedt As New DataTable
    2. Dim filter As String = "Kasse"
    3. Dim dr() As DataRow = OrthesenDS.OrthesenDT.Select(filter)
    4. kassedt = OrthesenDS.OrthesenDT.Clone
    5. For Each Row As DataRow In dr
    6. kassedt.ImportRow(Row)
    7. Next Row
    8. mcb_kasse.DataSource = kassedt.Select.ToList


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