DataView.RowFilter Performance

  • C#
  • .NET 5–6

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von E.T..

    DataView.RowFilter Performance

    Ich habe mir vor 2-3 Jahren ein UserControl gebaut, mit einem DataGridView, welches eine Zeile zur Filterung der Datensätze enthält. (siehe Anhang)
    An das DatagridView des UC lassen sich die unterschiedlichsten Daten per DataView als Source zuweisen.
    Die Datenfelder werden aus einer Auswahl zusammengestellt und dann einmalig aus der Datenbank geladen.
    Wir benutzen dieses UC für verschiedene Programme, z.B. für Artikeldaten, Lieferanten- Kunden und auch Umsatzdaten.
    Es ist Bestandteil einiger Programme (in VB und auch C#) und leistet gute Dienste. (Gesamtdatensätze meist zwischen 5.000 und 100.000)

    In der Regel werden nach Auswahl einer Zeile im DataGridview des UC dann Detaildaten im unteren Bereich (außerhalb des UC geladen.
    Eigentlich funktioniert es ganz prima bis auf die Zeitverzögerung je nach Suchworteingabe.
    Kopiere ich komplette Suchwörter in die Filterzeile ist alles i.O.
    Auch die Filterung über mehreren Spalten und damit der Zusammenbau der Filter im Code ist akzeptabel.
    Es hängt an den Einzelzeichen:
    Wird das Suchwort eingetippt, fängt das Programm bereits bei Einzelbuchstaben an zu filtern und mit jedem Zeichen wird die Zeitverzögerung größer.
    Z. B. bei langen komplexen Artikelnummern ist das nicht mehr wirklich angenehm.

    Es ist einerseits gewünscht, dass die Filterung bei Einzelzeichen beginnt, wenn z.B. die komplette Artikelnummer nicht bekannt ist oder man mehrere Varianten angezeigt haben möchte
    Andererseits ist diese Verzögerung sehr lästig.

    Ich sinne schon eine Weile darüber nach, wie ich diese Filterung optimieren könnte.
    Für den Abruf der Detaildaten benutze ich teilweise Threads, um umfangreiche Daten (auch aus unterschiedlichen Datenbanken) parallel abzurufen, was an dieser Stelle spürbare Beschleunigung bringt.
    Deshalb habe ich bei der Filterung schon mal mit einem Threadpool experimentiert. Das hat aber auch nichts gebracht.

    Irgendwie wäre es toll, wenn mehrere Buchstaben/Zeichen eingegeben werden, dass die vorangegangene Suche sofort abgebrochen wird u.s.w. bis man am Ende der Eingabe sofort das Ergebnis der letzten Filterung bekommt.
    Ich habe aber keinen Plan, wie man das erreichen kann.
    Hat jemand in diesem Bereich schon Erfahrungen?
    Bilder
    • Filter.png

      57,07 kB, 1.188×540, 67 mal angesehen
    Mir stellt sich die Frage, wie die Suche ausgelöst wird. Wahrscheinlich direkt durch das Eintippen und nicht durch Druck auf Enter. Naja, wenn man 100000 Artikel hat und ein e eintippt, kann das schon etwas dauern. Aber wenn man eine Nummer eintippt und bei jeder Ziffer dauert es länger, dann ist da wohl was falsch programmiert. Weil: Es wird ja spezifischer. Ist natürlich auch die Frage, in welchen Spalten nach der Nummer gesucht wird. Denn ne pure Nummer sollte ggf. nur in der Artikelnummerspalte gesucht werden. Ggf. bietet sich notfalls ein Sonderzeichen noch als Hilfe an. Wenn man die Eingabe mit z.B. # beginnt, weiß das Programm, dass eine Artikelnummer gesucht wird und reagiert erst ab 3 Ziffern. Da gibt's bestimmt einige Möglichkeiten. Aber auch zuviele Spekulatiuskrümel.
    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.
    Beim Start des Programms werden alle Datensätze (entsprechend der Zusammenstellung, im Beispiel ca. 65.000 Artikel) aus der Datenbank geladen. Das geht schnell.
    Beim Suchen wird nur ein DataView.RowFilter-Property gesetzt.
    Gibt man bei Artikelnummer einen Buchstaben dauert es ca. 120 ms.

    Das Problem ist das buchstabenweise Schreiben in die Filterzeile, weil bei jedem neu eingetippten Zeichen die Suche neu ausgelöst wird mit DGV_CellValueChanged

    Das ist aber so gewollt. Die Benutzer suchen auch mal nach allen Artikelnummer, die mit einer "2" anfangen.
    Würde die Suche z.B. erst bei 3 Zeichen anfangen, wäre es nicht so lästig.
    Aber das will ja keiner.

    Die Spalten sind alle typisiert und entsprechend wird auch gesucht. Es werden natürlich jeweils die Filter zusammengebastelt nach dem jeweiligen Filtermodus, der vom Benutzer gewählt werden kann (größer als, kleiner als, gleich, beginnt mit, endet mit enthält etc. je nach Datentyp gibt es unterschiedliche Vorgaben)

    filter1 += spaltenname + vgl + "'" + platzhalterVorn + value + platzhalterHinten + "' AND "; (für jede Spalte, in der was drin steht)
    - der Platzhalter kann "%" oder "" sein
    - vgl kann " = ", " > " " < " oder "like" etc.