Laden...

Realisierung einer Live-Suche/-Filterung für viele Daten (bei Benutzereingabe)

Erstellt von reloop vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.722 Views
reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren
Realisierung einer Live-Suche/-Filterung für viele Daten (bei Benutzereingabe)

Hallo,

Also zu meinem Problem:

In unserer Anwendung kann es durchaus vorkommen, dass der Benutzer bereits erfasste Daten suchen muss. (Aufträge, Rechnungen, Kunden, Produkte.. etc.)

Die Anzahl der Daten beläuft sich im Standardfall auf 1.000 - 4.000.

Wenn ich mir nun eine Erfassungsmaske vorstelle, wo der Benutzer bsp. auf einen Auftrag o.ä. zurückgreifen muss, komme ich ins grübeln wie ich das am Besten realisiere.

Momentan habe ich auf meiner GUI eine ComboBox, die per Binding an die Liste der Aufträge gebunden ist. Die Suche nach den Daten erfolgt quasi Instant. Bedeutet, wenn der Kunde in der Combobox einen Text eingibt, wird Automatisch nach jedem Tastendruck gefiltert. (Sofern die Text.Length > 3 ist, da es sonst wirklich zu langsam wäre.)

Das ganze ist ja nun nicht wirklich Benutzerfreundlich, wenn ich den Kunden ggf. noch nach anderen Attributen suchen lassen möchte - oder ihm eine andere Sortierung ermöglchen möchte.

Ausserdem dauert das Öffnen der Combobox (bei einer Anzeige von allen 2.000 Daten) schon seine 2-3 Sekunden.

Eine mir bekannte Alternative wäre auch noch, dass ich die Suche auf ein neues Fenster auslagere, wo der Kunde ein Grid hat über das er sich seinen Datensatz aussuchen kann.

Nun abschließend zu meiner Frage:

Wie gestaltet ihr dem Benutzer die Suche nach bereits erfassten Daten? Über eine ComboBox? Oder lasst ihr ein neues Fenster aufgehen in dem gefiltert werden kann?

Vielleicht habt ihr ja noch ein paar Tipps und Anregungen für mich.

Vielen Dank,
reloop

795 Beiträge seit 2006
vor 13 Jahren

Wie gestaltet ihr dem Benutzer die Suche nach bereits erfassten Daten? Über eine ComboBox? Oder lasst ihr ein neues Fenster aufgehen in dem gefiltert werden kann?

Hi.

Ich an deiner Stelle würde beides bereitstellen. So kann der Benutzer z.B. wenn er nur nach dem Namen des Datensatzes sucht, direkt in der Combobox suchen. Wenn er dann aber nach einem Attribut des Datensatzes suchen will, soll er halt F3 in der Combobox drücken, damit ein Fenster zur detailierten Suche aufgeht. Außerdem würde ich die Suche selbst in einen Thread auslagern, damit das UI nicht blockiert, wenn der User Daten eingibt.

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

zusätzlich könntest du die Daten auch lokal cachen (mit Ablaufdatum).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Danke für eure Anregungen und Hinweise.

Außerdem würde ich die Suche selbst in einen Thread auslagern, damit das UI nicht blockiert, wenn der User Daten eingibt.

Was genau würdest du im Thread auslagern? Quasi das ganze KeyDown-Ereignis oder nur die wirkliche Suche mit dem eingegebenen String der Daten?

Und würde es das ganze denn dann performanter machen? Momentan kommen ca. 2.500 Datensätze aus einer Textdatei die ich über eine CombobBox ausgebe, was (bei gesamter Datenmenge ohne Filterung) gerne mal 2-3 Sekunden dauert bis die CombobBox sich geöffnet hat.

zusätzlich könntest du die Daten auch lokal cachen (mit Ablaufdatum).

Kannst du das etwas genauer Erläutern? Bzw. wonach ich da genau suchen muss, um mich einzuarbeiten?

Momentan lese ich beim Start der Application schon die Kompletten Listen (*.txt) in eine Static List ein, damit ich nicht jedes mal aufs neue diese Datei initialisieren muss. Aber wirklich helfen tut dass bei der Geschwindigkeit nicht.

Wie o.g. dauert das Öffnen der ComboBox bei enthaltenen Daten > 2.000.

Vielen Dank für eure Mühe,
reloop

Gelöschter Account
vor 13 Jahren

wenn du die daten ohnehin schon im speicher hast, dann dauert das befüllen der combobox so lange. setze vor dem befüllen auf der combobox Suspendlayout und nach dem befüllen wieder releselayout.

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

Was genau würdest du im Thread auslagern? Quasi das ganze KeyDown-Ereignis oder nur die wirkliche Suche mit dem eingegebenen String der Daten?

Das Ereignis kannst du gar nicht auslagern da vom Conntrol. Den Ereignis-Handler indem die Suche stattfindet kannst du auslagern.

Kannst du das etwas genauer Erläutern? Bzw. wonach ich da genau suchen muss, um mich einzuarbeiten?

Den Cache kannst du dir als Dictionary vorstellen das ein Ablaufdatum für die Elemente hat.
Wenn du .net 4.0 hast kannst den MemoryCache Class (System.Runtime.Caching) vewenden, vorher kann auch der Cache Class (System.Web.Caching) von ASP.net dazu verwendet werden (es ist allerdings ein Verweis auf System.Web.dll notwendig ist somit auch das ClientProfile nicht anwendbar). Einen Cache kannst du dir auch leicht selbst basteln. Siehe zB Programmier-Spiel

Warum willst du überhaupt alle Einträge zuerst in die ComboBox laden? Das macht mMn nicht viel Sinn, du siehst ja dass das langsam ist. Zeige zu Beginn eine leer ComboBox an und wenn der Benutzer > 3 Zeichen eingegeben hat suchst die passenden Einträge und mit jedem weiteren eingegeben Zeichen werden die Items der ComboBox feiner gefiltert. Die Google-Suche machts auch so. Das Suchfeld zu Beginn ist auch leer 😉

Die Suche nach den passenden Einträgen fragt zuerst im Cache nach ob was passenden und nicht abgelaufenes da ist und falls ja wird dieses genommen, falls neine werden die Daten von der Datenquelle gelesen. Hier ist also die Entscheidung zwischen Geschwindigkeit und Arbeitsspeicherbedarf.
Du könntest in der ComboBox auch nur die ersten 10 Einträge darstellen und dann noch ein "mehr ..." und wenn darauf geklickt wird erst alle laden.
Möglichkeiten gibts viele.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

795 Beiträge seit 2006
vor 13 Jahren

setze vor dem befüllen auf der combobox Suspendlayout und nach dem befüllen wieder releselayout.

Meintest du nicht eher BeginUpdate und EndUpdate?

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
reloop Themenstarter:in
139 Beiträge seit 2010
vor 13 Jahren

Danke gfoidl, das war wirklich ein spitzen Beitrag und hat mich schonmal weitergebracht.

**Jack30lena **und ThreBrainiac,

gibt es diese Funktionialitäten auch für WPF?

Gruss,
reloop

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

gibt es diese Funktionialitäten auch für WPF?

in WPF würde ich dazu Priority Bindings verwenden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"