Ich möchte in der Lage sein, ein Listenfeld zu filtern, das 1000 Zeichen enthält, die jeweils 50 bis 4000 Zeichen lang sind, während der Benutzer ohne Verzögerung in das Textfeld eingibt.
Ich verwende derzeit einen Timer, der die Listbox nach der TextChanged
Ereignis des Textfeldes wurde in 300ms nicht ausgelöst. Allerdings ist dies ziemlich ruckelig und die Benutzeroberfläche friert manchmal kurzzeitig ein.
Wie wird eine solche Funktion normalerweise implementiert?
Bearbeiten: Ich verwende Winforms und .net2.
Gracias
Hier ist eine abgespeckte Version des Codes, den ich derzeit verwende:
string separatedSearchString = this.filterTextBox.Text;
List<string> searchStrings = new List<string>(separatedSearchString.Split(new char[] { ';' },
StringSplitOptions.RemoveEmptyEntries));
//this is a member variable which is cleared when new data is loaded into the listbox
if (this.unfilteredItems.Count == 0)
{
foreach (IMessage line in this.logMessagesListBox.Items)
{
this.unfilteredItems.Add(line);
}
}
StringComparison comp = this.IsCaseInsensitive
? StringComparison.OrdinalIgnoreCase
: StringComparison.Ordinal;
List<IMessage> resultingFilteredItems = new List<IMessage>();
foreach (IMessage line in this.unfilteredItems)
{
string message = line.ToString();
if(searchStrings.TrueForAll(delegate(string item) { return message.IndexOf(item, comp) >= 0; }))
{
resultingFilteredItems.Add(line);
}
}
this.logMessagesListBox.BeginUpdate();
this.logMessagesListBox.Items.Clear();
this.logMessagesListBox.Items.AddRange(resultingFilteredItems.ToArray());
this.logMessagesListBox.EndUpdate();