2009-02-23 5 views
3

Je construis une application d'indexation basée sur un arbre de suffixes, qui me permet d'indexer des documents entiers et de rechercher des chaînes, sous-chaînes, etc., extrêmement rapidement. Qu'est-ce que je fais est d'entrer une chaîne dans une zone de texte, en appuyant sur un bouton, et en cours d'exécution d'une fonction qui interroge le suffixtree et ajoute les positions de toutes les occurrences de la chaîne à une liste. La liste contient donc beaucoup d'entiers.Windows Forms listbox déborde lorsqu'il y a trop d'éléments à faire défiler

Normalement, cela fonctionne très bien. Par exemple, la recherche de "wizard" ou "Gandalf", ou "hobbit" (j'indexe FOTR comme un test: D) ​​fonctionne bien et dandy. Cependant, je l'essaie maintenant avec la lettre e.

Le problème est que les positions de la lettre e sont listées dans la liste. Tous 88974 d'entre eux. Toutefois, lorsque je fais défiler vers le bas en faisant glisser le bouton de défilement, la zone de liste apparaît de manière circulaire pour revenir en haut lorsque je suis autour de l'article 60000 ou plus. Le problème est rendu plus étrange par le fait que j'ai essayé de faire défiler avec la page vers le bas et tout fonctionne bien.

Je sais que le défilement des éléments 88974 (basé sur listbox.Items.Count) est un peu extrême, mais, logiquement, il n'y a aucune raison pour qu'il y ait un tel problème.

Merci d'avoir lu jusqu'ici!

EDIT: Pour tous ceux qui ont répondu, merci d'avoir répondu. J'ai finalement implémenté ceci avec une listview, et c'est beaucoup plus rapide, et peut contenir beaucoup d'éléments plutôt bien. Merci!

Répondre

4

Probablement ListBox utilise toujours les messages 16 bits de plage/position pour les barres de défilement. Vous pouvez essayer de le reproduire dans Win32 s'il s'agit d'un problème du contrôle sous-jacent.

Vous pouvez essayer un contrôle d'affichage de liste au lieu de la zone de liste. Je m'attendrais à ce qu'il ne se heurte pas à cette limitation, et son mode virtuel devrait également être plus efficace.

1

Il semble que vous frappiez une anomalie autour du point 16 bits (2^16 = 65536). Ma conjecture est que c'est un bug dans la logique de défilement pour le contrôle qui provoque un hoquet autour de ce point. Je suppose qu'ils pensent que personne ne mettrait plus de 65000 éléments dans une liste. :)

6

C'est un bug spécifique à Vista. Il va bonkers quand vous faites défiler 65536 + nombre d'éléments visibles. Le bogue n'a pas été corrigé dans SP1. Pas de problèmes sous XP. Mais oui, c'est un bug qui est rarement mis à l'épreuve.

+0

ressemble à ce bug existe encore avec Windows 8.1 – ThunderGr

1

Comme d'autres l'ont dit, il semble probable que vous rencontriez une limitation sur le nombre maximum d'éléments qui peuvent être stockés dans un ListBox. Il est probablement préférable de passer à l'utilisation d'un DataGridView en mode virtuel avec autant d'éléments.

mise en œuvre DataGridView est un peu trop long pour une réponse SO mais voici un lien vers un tutoriel:

http://msdn.microsoft.com/en-us/library/2b177d6d.aspx

Questions connexes