J'aimerais pouvoir filtrer une liste contenant 1000 chaînes de 50 à 4000 caractères chacune, car l'utilisateur saisit sans délai dans la zone de texte.Filtrage en temps réel de la listbox
J'utilise actuellement un temporisateur qui met à jour la liste après que l'événement TextChanged
de la zone de texte n'a pas été déclenché en 300ms. Cependant, c'est assez saccadé et l'interface utilisateur se fige parfois momentanément.
Quelle est la manière normale d'implémenter des fonctionnalités similaires?
Editer: J'utilise winforms et .net2.
Merci
Voici une version allégée du code Je suis actuellement en utilisant:
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 ou WinForms ou autre chose? – kbrimington
J'utilise des winforms. – Ryan