Ich möchte in der Lage sein, eine Listbox mit 1000 Strings, jeweils 50 - 4000 Zeichen Länge, zu filtern, wie der Benutzer in das Textfeld ohne Verzögerung eingibt.Echtzeitfilterung von Listbox
Ich verwende derzeit einen Timer, der die Listbox aktualisiert, nachdem das TextChanged
Ereignis des Textfelds nicht in 300ms ausgelöst wurde. Dies ist jedoch ziemlich ruckelig und die UI friert manchmal kurz ein.
Was ist der normale Weg, ähnliche Funktionen zu implementieren?
Edit: Ich verwende winforms und .net2.
Dank
wird hier eine abgespeckte Version des Codes Ich bin derzeit mit:
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();
ASP.NET oder WinForms oder etwas anderes? – kbrimington
Ich benutze Winforms. – Ryan