2010-05-19 4 views
1

Je souhaite masquer certains éléments en fonction d'un filtre de texte dans un ListView (WinForms).
Fondamentalement, le listview charge les éléments d'un fichier texte, et je ne veux pas qu'il soit lu et/ou écrit lorsque l'utilisateur recherche dans la liste. La recherche est effectuée dans l'événement KeyDown d'une liste déroulante, mais il n'existe aucune propriété "Visible" de ListViewItem.Masquage de ListViewItem en fonction d'un filtre

Existe-t-il un moyen facile de le faire, SANS relire le fichier? (comme il s'agit d'un fichier XML, et qu'il pourrait même contenir des milliers d'éléments, il serait difficile de chercher efficacement et même de laisser l'utilisateur utiliser l'application, car la recherche prendrait quelques minutes (surtout avec le chargement)).

+0

Pouvez-vous nous en dire plus sur l'environnement? WinForms? WPF? –

+0

Bien sûr, WinForms, je ne suis pas trop dans WPF. Je sais, je vais devoir l'apprendre, mais je le ferai seulement quand je le serai vraiment. – fonix232

+0

Maintenant, vous devrez peut-être, pour faire usage de la virtualisation. – Amsakanna

Répondre

1

Ce que vous essayez de faire n'est pas clair pour moi. Je vais encore crier quelques idées, peut-être quelque chose est utile ...

  • Cache le fichier dans la mémoire cache
  • les éléments de lecture et remplir la boîte d'entrée à la volée
  • Ajouter et supprimer la articles en conséquence
  • Regardez this question
  • Peut-être que c'est impossible après tout?

Désolé, je me suis trompé. :(

+0

Je veux modifier la propriété Visible à la volée ... Ou je voudrais, car elle n'existe pas ... pour moi au moins! – fonix232

+0

La solution de base serait d'ajouter et de supprimer les éléments, je suppose. – mafu

+0

Oui je sais que ce serait, mais comme je l'ai souligné, faire une base de données simple ne serait pas si facile, car nous parlons de milliers d'articles ... Je pense que je vais continuer à googler pour une classe ListViewItem personnalisée avec Visible propriété ... Ou devrais-je changer à DataGridView? Est-ce qu'il supporte même les cases à cocher automatiques? – fonix232

2

Vous subissez retard dû à redessiner de listbox tous les ajouter/supprimer l'opération. Essayez d'envelopper Ajout/Suppression op intérieur Début/Fin méthode de mise à jour comme celui-ci.

myListView.BeginUpdate(); 
//Add or Remove Items 
myListView.EndUpdate(); 

maintenant sentir la vitesse.

Ofcourse vous devez charger votre fichier une seule fois.

0

résolu avec la création d'une catégorie distincte pour stocker des données, et la recherche après le chargement du fichier.

Bien que l'écriture des modifications dans le fichier est encore une question, mais c'est une autre histoire ...

0

Ce n'est pas la meilleure réponse, mais un peu la meilleure solution que j'ai trouvé. Vous pouvez mettre en œuvre vous ListView.DrawItem événement pour faire quelque chose comme ceci:

void listView_DrawItem(object sender, DrawListViewItemEventArgs e) 
    {    
     if (Should_Filter(e.Item) == false) 
      e.DrawDefault = true;     
     else 
      e.DrawDefault = false; 
    } 

réordonner, tous les éléments pour que ceux filtrés sont à la fin de ListView. Cela les cachera un peu, mais ListView les comptera quand il calculera sa taille, donc vous devriez également redimensionner la liste des clients ListView avec force.