iCollectionview filter mit mehreren Teilbegriffen

  • WPF

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

    iCollectionview filter mit mehreren Teilbegriffen

    Hallo,
    hab da wieder was wo ich denke, dass ihr mir besser weiter helfen könnt als Google.

    In meinem WPF Projekt hab ich eine "Search TextBox" zum filtern meiner icollectionview programmiert. Funktioniert zwar, aber noch nicht so wie ich es gene hätte.
    Das sieht aktuell so aus:

    VB.NET-Quellcode

    1. View.Filter = New Predicate(Of Object)(AddressOf SearchCriteriaFilter)

    Wo View meine iCollectionview ist
    Und das hier hab ich als "SearchCriteriaFilter"

    VB.NET-Quellcode

    1. Private Function SearchCriteriaFilter(ByVal item As Object) As Boolean
    2. Dim gammeModifiee As GammeModifiee = CType(item, GammeModifiee)
    3. If SearchString = "*" Then REM alles anzeigen.
    4. Return True
    5. ElseIf IsNumeric(SearchString) Then
    6. Return gammeModifiee.NoArticle.ToString.Contains(SearchString.ToString)
    7. Else
    8. Return gammeModifiee.Description.Contains(SearchString) Or
    9. gammeModifiee.Description.Contains(SearchString.ToLower) Or
    10. gammeModifiee.Description.Contains(SearchString.ToUpper)
    11. End If
    12. End Function
    SearchString ist die Text-Eigenschaft der Such-TextBox. Soweit so gut. Aber bis jetzt kann ich immer nur einen einzigen Suchbegriff in meine Such-TextBox eingeben oder eine einzige Zahl.Zur Zeit kann ich keine durch "Sternchen"(*) getrennte Reihenfolge von Teilbegriffen eingeben.
    Wenn ich also z.B. unter anderem in meinen Daten den String: BMW S 1000 RR habe, dann möchte ich bei der Eingabe von z.B. BMW*1000*R* (es fehlt ein "S" und ein *R" und die Leerzeichen) einen Treffer haben.
    Hat jemand einen Tip wie ich das anpacken könnte?
    Danke im Voraus,Jeiss

    Bin mir da nicht sicher ob das Funktioniert beim IQueryable Of Char.

    Ich hätte (oder habe immer) sowas wie folgt gemacht:

    VB.NET-Quellcode

    1. Private Function SearchCriteriaFilter(obj As Object) As Boolean
    2. If String.IsNullOrEmpty(SearchString) Then Return True
    3. Dim searchParams = SearchString.Split(CType("*", Char()))
    4. For Each p In searchParams
    5. If Not String.IsNullOrEmpty(p) Then
    6. If Not DirectCast(obj, GammeModifiee).Description.ToLower().Contains(p.ToLower()) Then
    7. Return False
    8. End If
    9. End If
    10. Next
    11. Return True
    12. End Function


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo,
    vielen Dank für die zwei wunderbaren Vorschläge.
    Beide sind unterschiedlich aber beide funktionieren wunderbar.

    Die "like-Variante" ist einfach mega. Verblüffend was man mit einer einzigen Code-Zeile bewirken kann. Genial!
    Sie hat den kleinen Nachteil (auf meine Anwendung bezogen), dass sie die Klein-Großschreibung strikt beachtet.
    Und da die Daten die ich in meiner Anwendung filtern möchte aus einer anderen Anwendung stammen, sind die nicht immer einheitlich "formatiert".
    Und so kann man mal den einen oder anderen Datensatz verpassen, weil man den Suchbegriff gross, statt klein, oder umgedreht als Suchbegriff eingegeben hat. In meinen Datensätze stehen sogar Sachen wie z.B. "SiN……" (ein Mix aus Gross- Kleinschreibung). Diese Variante beachtet auch die Reihenfolge der durch * getrennten Suchbegriffe. Das gibt genauere Treffer.(Vorausgesetzt man weiß wonach man sucht )

    Dieses Problem mit der Gross-Kleinschreibung gibt es bei der anderen Variante nicht, da sowohl die Suchbegriffe als auch die zu filternden Daten als .ToLower verglichen werden. Die zweite Variante beachtet die Reihenfolge der Suchbegriffe nicht. Es wird nur geprüft ob die Suchbegriffe irgendwo im String vorkommen. Als Folge davon erhält man mehr Treffer.
    Ich werde wahrscheinlich beide Varianten in meiner App verwenden. Die Like-Version als Standard. Und wenn ich mal damit nicht die erhoffte Ergebnisse finden sollte, dann kann ich in meiner Anwendung ja einfach auf die "weniger selektive" zweite Variante zurückgreifen.

    Auf jeden fall danke ich euch beide für eure sehr lehrreichen Beiträge,
    Jeiss
    Coole Sache @ErfinderDesRades, muss ich mir merken. Danke!
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##