2009-07-27 8 views
0

Je continue d'obtenir une exception (voir ci-dessous) lorsque je récupère une liste de lignes d'une grille de données en mode virtuel, cela se produit uniquement lorsque j'ai plus de lignes que et ça n'arrive pas à chaque fois. Y at-il quelque chose qui me manque en ce qui concerne le mode virtuel? Mise à jour> L'image ci-dessous montre le problème, l'index est maintenant en dehors de la plage de la liste. La raison en est que j'ai 10 articles et je cache 5 car ils ne sont pas nécessaires et je veux exécuter du code sur les 5 qui sont visibles, il y a maintenant 5 articles mais l'indice de certains peut-être entre 5-9, comment puis-je ré-indexer? Quand j'ai exécuté du code sur le 5 visible, alors je montre le 5 caché, donc je ne veux pas les déranger, il faudrait que je réindexe quand ils sont tous visibles. Merci beaucoup.C# Exception lors de la récupération de lignes d'une grille de données en mode virtuel

alt text http://i28.tinypic.com/23iyp95.png

+0

J'ai ajouté une 3ème photo montrant la valeur nulle de la ligne a échoué, c'est vrai ou false pour les autres lignes. –

+0

J'ai enlevé les images plus anciennes que la nouvelle photo montre clairement le problème, je dois ré-indexer (je pense), comment ferais-je cela? Merci –

+0

Toute aide avec ceci serait grandement appréciée. Merci –

Répondre

0

Je n'ai utilisé le mode virtuel avec DataGridView, mais en mode virtuel que vous êtes censé stocker les données vous-même et fournir lorsque le DataGrid doit pour le rendu. Je suppose que la grille de données ne crée que le nombre minimum d'éléments requis pour remplir la vue, puis les réutilise pour des raisons de performances.

0

Cela ressemble un peu à un problème de threading. Utilisez-vous un BackgroundWorker ou quelque chose de similaire pour remplir la variable _items? Il semble que le nombre de choses dans _items change pendant que vous êtes en boucle.

Peut-être que vous pourriez essayer entourer tout et tout le code traitant _items avec ceci:

lock (_items) 
{ 
    // your code 
} 

Sinon, sortir de ces fonctions et retourner null si votre population/code de modification est toujours en cours d'exécution (utiliser une sorte de variable sentinelle booléenne peut-être).

0

Comment avez-vous configuré votre liaison de données?

Serait-il possible de travailler avec le jeu de données sous-jacent au lieu de passer par le DataGrid?

+0

Salut Shiraz, C'est une longue histoire mais je dois idéalement utiliser les données que j'ai déjà dans le DataGrid. –

0

Soyez simplement conscient des limitations du mode virtuel de DataGridView. En dépit de sa supposée caractéristique de consommation de mémoire faible (seules les lignes visibles sont chargées à partir de la base de données); chaque ligne a sa propre instance (pour prouver, essayer de redimensionner chacune des lignes DataGridView, les tailles des lignes peuvent être définies indépendamment les unes des autres, donc les informations de chaque ligne (par exemple RowHeight) doivent être sauvegardées dans leur propre mémoire)

vous définissez le RowCount, il instanciera n nombre de lignes à partir de ce que vous avez spécifié dans RowCount. Vaincre ainsi l'un des objectifs initiaux du mode virtuel de DataGridView, la consommation de mémoire faible. Trop de consommation de mémoire pourrait ralentir votre écran DataGrid

Voir mon article ici http://www.codeproject.com/KB/grid/DataGridView_Billion_Rows.aspx, et l'autre article http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/243a81e7-909b-4c8e-9d28-6114248cf66e

Questions connexes