Me gustaría poder filtrar un listbox que contiene 1000 cadenas, cada una de 50 a 4000 caracteres de longitud, ya que el usuario escribe en el cuadro de texto sin demora.Filtrado en tiempo real de listbox
Actualmente estoy usando un temporizador que actualiza el listbox después de que el evento TextChanged
del cuadro de texto no se haya activado en 300ms. Sin embargo, esto es bastante desigual y el ui a veces se congela momentáneamente.
¿Cuál es la forma normal de implementar una funcionalidad similar a esta?
Editar: Estoy usando winforms y .net2.
Gracias
que aquí hay una versión simplificada del código que estoy usando actualmente:
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 o WinForms o algo más? – kbrimington
Estoy usando winforms. – Ryan