Probleme mit bindingsource.filter

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von oliver3121.

    Probleme mit bindingsource.filter

    Hallo, ein seltsames Problem, bei dem ich grade nicht weiter komme:
    eine bindingsource wird über verschiedene Filter in einem Datagrid immer richtig dargestellt:

    nach dem Schema:

    filter1 = String.Format("Spaltenname1 like '*{0}*'", Textbox1.Text)
    filter2 = String.Format("Spaltenname2 like '*{0}*'", Textbox2.Text)

    BindingSource.Filter = filter1 & " And " & filter2

    Funktioniert super so weit. Ich baue aber auch gleichzeitig Ausschlussfilter ein, die optional aktiviert werden können:
    z.b.:
    filter1 = String.Format("Spaltenname1 not like '*{0}*'", Textbox1.Text)

    Das funktioniert ebenfalls. Versuche ich die Nullwerte zu erwischen, geht das ebenfalls sehr schön mit z.B.:
    filter2 = String.Format("Spaltenname2 Is Null Or Spaltenname2 not like '*{0}*'", Textbox2.Text)

    Aber wieso um alles in der Welt funktioniert dann die Kombination der Filter nicht mehr:
    BindingSource.Filter = filter1 & " And " & filter2

    hat das Ergebnis, dass filter1 gelöscht wird?
    Wahrscheinlich trivial, aber ich komme einfach nicht drauf.
    Vielleicht jemand eine Idee?
    Doch, um die Funktion zu testen, habe ich Datensätze angelegt, die diese Kriterien erfüllen.

    Ah, o.k. hab's jetzt: Wird der 2. Filter als Ausschlußfilter gesetzt, ist es besser, die Reihenfolge zu verändern:
    BindingSource.Filter = filter2 & " And " & filter1


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

    Ich denke mal das Problem ist nicht der String an sich, sondern die Art der Verknüpfung.

    Das blöde an dem logischen OR und AND ist folgendes:
    Wenn ich sprachlich etwas mit UND/AND verknüpfe, dann ist UND/AND ein Inklusion, ein ODER/OR eine Exklusion.
    Wenn ich logisch etwas mit UND/AND verknüpfe, dann ist UND/AND eine Exklusion, ein ODER/OR eine Inklusion.

    Bei der Frage "Wer spielt alles Handball UND Fußball?" kommen MEHR Ergebnisse/eine größere Ergebnismenge raus, als wenn ich (sprachlich) frage: "Wer spielt alles Fußball ODER Handball?".
    Denn wo bei "UND" alle inbegriffen sind, die A) entweder Fußball, B) Handball, oder C) Handball UND Fußball spielen, sind bei "ODER" nur die inbegriffen, die EINES von beiden spielen. Personen die beides machen, fallen da raus.

    Beim Logischen UND bzw ODER ist das ganze anders rum:
    (Um das ganze mal an Proggen anzupassen mach ich dass jetz mal in SQL)

    SQL-Abfrage

    1. SELECT * FROM tabPersonen WHERE sportart = "Handball" AND sportart = "Fußball"
    2. // Bringt als Ergebnisse nur Personen, die BEIDES spielen
    3. SELECT * FROM tabPersonen WHERE sportart = "Handball" OR sportart = "Fußball"
    4. // Bringt als Ergebnisse nur Personen, die mindestens eine der Sportarten spielen UND auch die, die beides machen.


    @oliver3121: Probier doch bitte einmal ein OR als Verknüfpung und/oder überdenk deine Abfrage einfach einmal.
    Catte deine Strings bitte mit String.Concat() oder String.Join() zusammen und trenne GUI und Code

    Sprich kein TextBox1.Text sondern zuerst eine Stringvariable erstellen, die dann dem Text zuweisen und diese Variable dann verwenden

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    - die strings stehen ja oben im 1. beitrag
    - komischer Weise hat die Reihenfolge der Filter doch einen Einfluss auf das Filterergebnis
    - eine Or- Verknüpfung hatte ich auch schon ausprobiert, die führte aber zu keinem sinnvollen Ergebnis

    Nach Anfangseuphorie von
    BindingSource.Filter = filter2 & " And " & filter1
    hatte ich doch Unsauberkeiten im Ergebnis feststellen müssen (die Nullwerteinträge aus Spalte von Filter2 werden auf die spalte von filter1 übertragen)

    Aus Zeitgründen gebe ich mich grade mit der Lösung zufrieden, bei der nur der 1.Filter als Ausschlußfilter gesetzt werden kann, was im Rahmen exakt dieser Anforderung o.k. ist. Diese Ergebnisse sind vollständig richtig.
    Dann könntest du doch das Rätsel auflösen.

    Also eine Codezeile ala

    VB.NET-Quellcode

    1. bindingSource1.Filter = "Spalte1 like 'hum*' and Spalte2 like 'ham*'"
    Dazu könnte man sich qualifiziert äussern.
    (Klar kann ich das auch selbst auflösen, wenns stimmt, dass ich die Strings iwo in post#1 auffinden kann - aber du warst glaub der mit der Fragestellung)
    (Edit: Es stimmt übrigens nicht - in post#1 sind die Strings auch nicht aufgeführt :thumbdown: )
    sorry, aber einfach nur:

    Dim filter1 As String
    Dim filter2 As String

    'Als normaler Filter, über Bedingung ausgewählt
    filter1 = String.Format("Spaltenname1 like '*{0}*'", Textbox1.Text)

    'Als Ausschlußfilter, über Bedingung ausgewählt
    filter1 = String.Format("Spaltenname1 Is Null Or Spaltenname1 not like '*{0}*'", Textbox1.Text)

    filter2 = String.Format("Spaltenname2 like '*{0}*'", Textbox2.Text)

    BindingSource.Filter = filter1 & " And " & filter2

    mehr gibs da wirklich nich...Die Spaltennamen und Textboxnamen variieren natürlich. Vielen Dank für das interesse, aber in der Zwischenzeit hab ich ja ein Ergebnis gefunden, das für's erste reicht.
    - Ein Nachtrag zum Thema (falls mal jemand über dieses Problem stolpert):

    Ein Ausschlußfilter soll einem Vorfilter nachgeschaltet werden (aus einer Auswahl -Filter1 soll eine neue Auswahl -Filter2, aber ohne angegebenes Element getroffen werden)
    Im Beispiel beziehen sich Filter1 auf Spalte1 (Suchwert1 wird in Textbox1 eingetragen) und Filter2 auf Spalte2 (Suchwert2 wird in Textbox2 eingetragen- Suchwert2 ist der Ausschlußwert). Spalte2 enthält auch Nullwerte.

    Dim filter1 As String
    Dim filter2 As String
    Dim Filter3 As String

    filter1 = String.Format("Spalte1 like '*{0}*'", TextBox1.Text)
    filter2 = String.Format("Spalte2 Not like '*{0}*'", TextBox2.Text)
    Filter3 = String.Format("Spalte2 Is Null Or Spalte1 like '*{0}*'", TextBox1.Text)

    Me.Tabelle1BindingSource.Filter = (filter1) & " AND " & (Filter3) & " AND " & (filter2)

    Verglichen mit oben, führt die Teilung von filter2 zur richtigen Darstellung


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