Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Realisierung einer Live-Suche/-Filterung für viele Daten (bei Benutzereingabe)
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
TheBrainiac
myCSharp.de - Member

Avatar #avatar-3152.png


Dabei seit:
Beiträge: 795
Herkunft: /dev/null

beantworten | zitieren | melden

Zitat von reloop
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"
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.856
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

beantworten | zitieren | melden

Danke für eure Anregungen und Hinweise.
Zitat von TheBrainiac
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.
Zitat von gfoidl
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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von reloop am .
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

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.
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.856
Herkunft: Waidring

beantworten | zitieren | melden

Hallo,
Zitat
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.
Zitat
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!"
private Nachricht | Beiträge des Benutzers
TheBrainiac
myCSharp.de - Member

Avatar #avatar-3152.png


Dabei seit:
Beiträge: 795
Herkunft: /dev/null

beantworten | zitieren | melden

Zitat von JAck30lena
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"
private Nachricht | Beiträge des Benutzers
reloop
myCSharp.de - Member

Avatar #avatar-3256.jpg


Dabei seit:
Beiträge: 139

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.856
Herkunft: Waidring

beantworten | zitieren | melden

Hallo,
Zitat
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!"
private Nachricht | Beiträge des Benutzers