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
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.
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!"
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
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!"
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.
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
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!"