Datagridview mit Autofilter und Databinding.filter

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

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von steffenforever.

    Datagridview mit Autofilter und Databinding.filter

    Hallo,

    ich brauche jetzt mal Hilfe. Habe schon so viele Beiträge gelesen aber ich komme nicht weiter.

    Ich nutze das Datagridview und den Autofitler von MS : msdn.microsoft.com/en-us/library/aa480727.aspx .

    Zusatzlich habe ich ein Bindungsource erstellt um das Datagridview über eine Textbox zu Filtern.

    - was in Kombination mit dem Autofilter funktioniert ist eine einfache Suche in der Textbox in nur einer Spalte :

    Quellcode

    1. bs.Filter = String.Format("Convert(Artikel, System.String) LIKE '%{0}%'", TextBox1.Text)

    - was nicht funktioniert ist die Suche über 2 Spalten in der Textbox :

    Quellcode

    1. bs.Filter = String.Format("Convert(Artikel, System.String) LIKE '%{0}%' OR Convert(Suchbegriffe, System.String) LIKE '%{0}%' ", TextBox1.Text)
    --> hier wird der Autofilter von MS blockiert und er filtert rein gar nichts mehr


    Ich vermute nun ich muss einen zweiten Bindingsource Filter erstellen und die 2 Suchparameter aufsplitten, bin mir nur nicht sicher wie ?

    Ich hoffe jemand vesteht was ich meine besser konnte ich es nicht beschreiben.

    Mfg.
    Steffen

    PS.: Die Überschrift ist etwas unglücklich geschrieben BindingSource.Filter wollte ich schreiben.

    steffenforever schrieb:

    Ich vermute nun ich muss einen zweiten Bindingsource Filter erstellen ... wie?
    Jo weiß ich auch nicht.
    BindingSource hat nur eine Filter-Property, da kann man keine mehreren Filter erstellen.
    Wie's scheint generiert die Autofilter-Geschichte iwie Filter-Ausdrücke, und wenn du auch Filter-Ausdrücke anwendest, dann kommt sich das in die Quere.
    Mich wundert eher, dass das erste Snippet ühaupt funktioniert.
    Hallo ErfinderDesRades,

    Ja irgendwas kommt sich was in die Quere. Ich habe gerade herausgefunden das es auch manchmal teils funktioniert. Ich habe nur nach einzelnen Buchstaben gefiltert und wenn die Buchstaben in beiden Spalten in allen Zellen auch vorkommen funktioniert der Filter zumindest ohne zu blockieren Das Ergebnis des Filters ist dann aber trotzdem Falsch.

    Das es nur eine Filter Property gibt wird wohl das Primäre Problem sein. Ich verwende schon eine "OR" Anweisung und die Autofilterfunktion von MS Filtert auch im Bindingsource herum. Die Kombination aus beidem ist offenbar der Tot. Jetzt ist die Frage wie ich alles so kombinieren kann das ich über 2 Spalten im DGV suchen kann und der Autofilter noch funktioniert.

    Der Vorgang über die Suche der Textbox muss irgendwie abgeschlossen werden vermute ich und das Datagridview/Bindingsource neu gefüttert werden. Alles was ich bisher probiert habe ging aber schief.

    PS.: Was mir gerade noch eingefallen ist: Gibt es denn eine Möglichkeit dem Autofilterdropdown evtl. meinen Suchtext aus der Textbox einzuschleusen so das ich dort auch meine Like Anweisung ausführen kann ?

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

    keine Ahnung, ich kenne dieses Autofilter-Dingens nicht.
    Ich würd auf jeden Fall mal empfehlen, vor und nach dem Setzen deines Filters einfach mal die Filter-Property in die Debug-Ausgabe zu schreiben.
    Dann erkennst du, was das AutoFilterDingens treibt, und dann wird sicher klarer, wie die sich in die Quere kommen.

    Ich werkel die letzte Zeit selbst extrem viel mit BindingSource.Filter herum, auch die Problematik, verschiedene Filter zu kombinieren.
    Ich hab mir was gebastelt, was mit aufwendigen String-Operationen "FilterSegmente" bildet, und die dann mit "AND" verknüpft.
    Ist schon schwierig genug, hinzukriegen, dass jedes Filtersegment "seinen" Abschnitt im Filterstring auffindet, und nur den modifiziert, ohne die anderen Filter-Abschnitte zu überschreiben.
    Und ist auch nicht perfekt, weil meine Filtersegmente sind halt prinzipiell immer And-verknüpft (können also keine Or-Verknüpfung, und können auch keine Negation.

    Wie gesagt: lass dir mal die Filter-Property ins Debug-Fenster ausgeben - vorher/nachher.
    Ich hatte neulich die Anforderung ein DGV "wie in Excel" filtern zu können. Gefunden habe ich dann folgendes: codeproject.com/articles/33786/datagridview-filter-popup

    Es ist nicht wunderschön, wer fähig ist kann sicher etwas dran rumbasteln, für meine Zwecke hat es ... genügt. Nach dem einbinden der dll lief das ganze bei mir recht problemlos. Der Comboboxfilter hat jedoch leider nie funktioniert, mit dem wär es für mich perfekt gewesen. Ich weiß das löst dein Problem nicht, umgeht es jedoch vielleicht.
    In dem Artikel wird einfach nur gesagt das er über die BindingSource filtern soll.

    Hier wird auch beschrieben wie es geht.
    In dem Beispiel wird nach Artist oder CD gesucht.

    VB.NET-Quellcode

    1. ' The Filter string can include Boolean expressions.
    2. source1.Filter = "artist = 'Dave Matthews' OR cd = 'Tigerlily'"


    Schau dir das mal genauer an.

    Vielleicht stellst du auch etwas mehr Code und Infos zur Verfügung, dann kann man dir sicher helfen.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Angebunden ist es an eine XML Datenbank:

    Quellcode

    1. DataSet1.ReadXml(myXmlFilePath)
    2. bs.DataSource = LagerDataGridView.DataSource.


    Hier der Quellcode für die Suche per Texteingabe :

    Quellcode

    1. If ComboBox1.Text = "Artikel o. Suchbegriff" Then
    2. bs.Filter = String.Format("Convert(Artikel, System.String) LIKE '%{0}%' OR Convert(Suchbegriffe, System.String) LIKE '%{0}%' ", TextBox1.Text)
    3. ' bs.Filter = "[Artikel] LIKE '" & TextBox1.Text & "%' OR [Suchbegriffe] LIKE '" & TextBox1.Text & "%'"
    4. LagerDataGridView.DataSource = bs
    5. LagerBindingSource1.EndEdit()
    6. LagerDataGridView.Refresh()
    7. End If


    In dem Beispiel was ich gefunden habe wird scheinbar die Bindingsource Temporär zwischengespeichert um danach den Autofilter verwenden zu können. Keine Ahnung wie ich das anstellen soll.
    Wende Deinen Filterausdruck doch einfach mal auf die LagerBindingSource1.
    Und schau mal in die Dokumentation, ob die Verwendung der Platzhalter "%" so richtig ist.
    Vielleicht wäre der Platzhalter "*" angebrachter?
    Im Moment filterst Du Artikel. deren Name mit dem Inhalt der Textbox1 ANFÄNGT und danach beliebige Zeichen hat, ODER Suchbegriffe. deren Name mit dem Inhalt der Textbox1 ANFÄNGT und danach beliebige Zeichen hat.

    us4711 schrieb:

    Wende Deinen Filterausdruck doch einfach mal auf die LagerBindingSource1.
    Und schau mal in die Dokumentation, ob die Verwendung der Platzhalter "%" so richtig ist.
    Vielleicht wäre der Platzhalter "*" angebrachter?
    Im Moment filterst Du Artikel. deren Name mit dem Inhalt der Textbox1 ANFÄNGT und danach beliebige Zeichen hat, ODER Suchbegriffe. deren Name mit dem Inhalt der Textbox1 ANFÄNGT und danach beliebige Zeichen hat.


    Danke soo einfach ;)
    Jetzt funktioniert es Dankeschön :)