Vb 2008 datagridview très lent

cs_philcam Messages postés 132 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 17 octobre 2008 - 21 juin 2008 à 14:34
cs_lexouille Messages postés 4 Date d'inscription lundi 28 avril 2003 Statut Membre Dernière intervention 2 octobre 2009 - 2 oct. 2009 à 08:47
Salut à tous,

j'essaye de charger des données issues d'un simple fichier txt (données séparées par des virgules) dans un datagridview (vb 2008 express)
mais je suis déprimé par la lenteur de l'affichage des données, j'ai essayé avec 50 lignes pour que ça réagisse en moins d'une seconde, et mon fichier fait 1000 lignes
quand je lance avec les milles lignes je suis obligé de killer l'appli car ça rame trop, et pourtant je suis sur un dual-core
décidemment à chaque fois que je me décide à faire un prog en vb.net pour lacher vb 6.0 il y a des trucs comme ça qui me le font regretter
est-ce qu'il y a des astuces pour que ce contrôle soit réactif et fluide ?

merci

19 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 juin 2008 à 15:43
quel est le code que tu utilise pour afficher ton fichier dans le datagrid ????

.net est certe un peu plus lent en apparence que VB6 mais quand même pas à ce point

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
0
cs_philcam Messages postés 132 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 17 octobre 2008
21 juin 2008 à 16:12
en fait j'ai fait un tableau :

Dim Tableau (500, 12)

et ensuite une boucle

For I = 1
To 500
   

For A = 0
To 11
      DataGridView1.Item(A, I).Value = Tableau (I, A)

   Next
Next

un truc dans ce genre, et ça met des plombes à remplir la grille
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 juin 2008 à 17:20
Es-tu sur que ce soit ce code qui te prenne beaucoup de temps.

Chez moi, il prend moins d'une seconde

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
0
cs_philcam Messages postés 132 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 17 octobre 2008
21 juin 2008 à 20:16
j'ai pas dit que c'était le code, c'est le remplissage de la grille qui est long, on voit la jauge verticale de la datagrid qui commence a apparaitre car les lignes sont rajoutées, et puis ça freeze jusqu'à ce que la datagrid soit remplie.

le code est pas compliqué, peut être un peu débutant mais bon :

et là j'ai bridé à 100 entrées sinon c'est la cata.



Private



Sub
OuvrirToolStripMenuItem1_Click(

ByVal
sender

As
System.Object,

ByVal
e

As
System.EventArgs)

Handles
OuvrirToolStripMenuItem1.Click




Dim
Fichier

As



String
=

""








Dim
La(10000, 11)

As



String






Dim
Compteur

As



Integer
= 0


Dim
Coll

As



Integer
= 0


Dim
I

As



Integer
= 0


Dim
A

As



Integer






If
OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK

Then

Fichier = OpenFileDialog1.FileName()







End



If

FileOpen(1, Fichier, OpenMode.Input)


Input(1, La(10000, 11))




'place la 1ere ligne inutile du fichier dans le fond du tableau






While



Not
EOF(1)Input(1, La(Compteur, Coll))


If
Coll < 11

Then

Coll = Coll + 1







Else

Coll = 0


Compteur = Compteur + 1







End



If






End



While

FileClose()







For
I = 0

To
11DGV1.Columns.Add(I.ToString, La(0, I))


Next

DGV1.RowCount = 101







For
I = 1

To
100

'mis a 100 pour eviter le clash sinon c'est la variable compteur






For
A = 0

To
11DGV1.Item(A, I).Value = La(I, A)


Next






Next














End



Sub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 juin 2008 à 20:59
Je ne sais pas quoi te dire.

Je viens de reprendre ton code exactement comme tu l'as mis en faisant sauter la limite de 100 et en remplaçant par compteur comme tu indique.
J'ai importer un fichier représente 2446 lignes dans la grille et cela à mis exactement 812 ms

N'aurais-tu pas d'autres traietements qui se font en parallèle à ton import ?
Ou alors tu as mis des évènements sur la datgrid qui se déclenchent au moment de l'import.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
0
cs_philcam Messages postés 132 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 17 octobre 2008
22 juin 2008 à 00:56
en fait je viens d'essayer mais avec l'exe généré et non pas en mode debug, et effectivement c'est plus rapide.
mais quand même, quand je bouge la jauge pour faire défiler la datagrid vers le bas c'est loin d'être fluide, ça fait comment chez toi ?
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
22 juin 2008 à 20:47
ben non, aucun problème de scrolling particulier, juste un léger clignotement durant le déplacement de la barre mais le rafraichissement est instantané dès que je bouge plus.

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
0
cs_philcam Messages postés 132 Date d'inscription dimanche 12 août 2001 Statut Membre Dernière intervention 17 octobre 2008
23 juin 2008 à 00:20
bon, j'ai essayé un contrôle utilisateur externe qui suffit largement à l'utilisation que je veux en faire (lamegrid.dll) et nettement plus léger.

merci quand même
0
koalolo Messages postés 1 Date d'inscription mardi 9 septembre 2008 Statut Membre Dernière intervention 9 septembre 2008
9 sept. 2008 à 12:09
Ben Je suis face à un problème similaire.

J'utilise un datagridview dans un programme qui ne sert qu'a afficher une sorte de calendrier.
Ce programme je bosse dessus depuis mai.

A l'époque j'avais un Pc avec un P4E de 3.00 ghz, aucun problème d'affichage.
Je viens de changer pour un quadcore, et maintenant le datagridview s'affiche très lentement.

Pour les deux machines j'ai un windows sp2, et j'utilise le même fichier vb et la même version de vb 2008 express, donc à part la config matériel je ne vois pas ce qui peut expliquer cette différence.

Si quelqu'un a une idée...
0
cs_lexouille Messages postés 4 Date d'inscription lundi 28 avril 2003 Statut Membre Dernière intervention 2 octobre 2009
28 avril 2009 à 15:55
Bonjour à tous,

J'ai le même problème de rafraîchissement d'un DataGrid (VB.Net 2008).
Le chargement est normalement rapide, mais l'affichage est très lent. Je vois une sorte de balayage du tableau à chaque rafraîchissement de la fenêtre (scrolling, affichage de la fenêtre, etc...).
J'ai essayé sur d'autres machines beaucoup moins puissantes et aucun problème. En plus j'ai une super bécane : xeon dual core, 3Go RAM, quadro fx 3700, raptor 10000 tr/min !!!
Je pense qu'il y a un problème avec le matos, c'est pourquoi j'ai fait une MàJ des drivers graphique mais nada, que dalle, ça ne marche pas mieux.
Je suis en xp sp2 également.

D'autres personnes dans le même cas ?!

A+


Lexouille
0
BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 1
20 mai 2009 à 08:51
bonjour , Pareil pour moi. A moin que ca vienne de mon code, je suis preneur, voi le bout de code de remplissage du tableau. au debut j'ai cru que c'etait le "add" qui posait probleme. Mais meme avec ce code c'est pareil. Si quelqu'un a une idée, je suis preneur. Le balayage sur 12*7 c'est horrible. moins d'une seconde, mais le balayage est fatiguant. Alors sur mon aplli en cours avec 7 * 2000 je met un temps fou ...
dataGridView.ColumnCount = 7;
dataGridView.RowCount = 12;
dataGridView.Columns[0].Name = "Ordre";
dataGridView.Columns[1].Name = "Nom planète";
dataGridView.Columns[2].Name = "Metal";
dataGridView.Columns[3].Name = "Or";
dataGridView.Columns[4].Name = "Cristal";
dataGridView.Columns[5].Name = "Hydrogène";
dataGridView.Columns[6].Name = "TOTAL";

        dataGridView.Columns[0].Width = 50;
        dataGridView.Columns[1].Width = 90;
        dataGridView.Columns[2].Width = 80;
        dataGridView.Columns[3].Width = 80;
        dataGridView.Columns[4].Width = 80;
        dataGridView.Columns[5].Width = 80;
        dataGridView.Columns[6].Width = 80;
   
      //dataGridView.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
      dataGridView.CellBorderStyle = DataGridViewCellBorderStyle.Single;
      dataGridView.GridColor = Color.Black;
      dataGridView.RowHeadersVisible = false;
      dataGridView.RowsDefaultCellStyle.BackColor = Color.White;
      dataGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.Yellow;
      dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
      dataGridView.MultiSelect = false;
      dataGridView.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
      //dataGridView.Dock = DockStyle.Fill;
           
          if(OpenFile()==true)
          {
          i = -1;
                foreach (DataGridViewRow row in dataGridView.Rows)
                {
                    i++;
                    row.Cells[0].Value = Planete[i].Ordre;
                    row.Cells[1].Value = Planete[i].Nom;
                    row.Cells[2].Value = Planete[i].Metal;
                    row.Cells[3].Value = Planete[i].Or;
                    row.Cells[4].Value = Planete[i].Cristal;
                    row.Cells[5].Value = Planete[i].Naquada;
                }
          }

MisterMok
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
20 mai 2009 à 09:14
Pour éviter le problème de clignotement, vous pouvez bloquer le rafraichissement de la datagrid à l'écran durant le remplissage.
Il faut mettre NomDataGrid.SuspendLayout, juste avant de commencer le remplissage. Une fois celui-ci terminer, il faut réactiver le rafraichiseemnt de la datagrid en mettant NomDataGrid.RestoreLayout

---- Sevyc64  (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE #   
0
BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 1
20 mai 2009 à 09:28
bonjour et merci casy.

c'est une méthode que j'avais déjà utilisée mais sans différence. Le l'ai retestée par acquis de conscience mais je confirme : rien. De ce que j'avais compris en lisant la MSDN sur le SuspendLayout/ResumeLayout c'est que cela influait surtout sur les dimensionnement/redimmensionnement des controles. Genre un panel dans lequel on crée des controles dynamiquement. Enfin je peux me tromper mais dans mon cas ca ne fonctionne pas et le clignotement est toujour present..

Merci quand meme :(
a noter que j'ai E8500 - 4GRam (bon 3.2Go je sais :) ) et sous XP. j'ai peu de processus lancé. Je ne pense pas que la becanne soit a mettre en cause. :(

MisterMok
0
cs_lexouille Messages postés 4 Date d'inscription lundi 28 avril 2003 Statut Membre Dernière intervention 2 octobre 2009
20 mai 2009 à 09:32
Merci pour l'info, mais le problème ne concerne pas le remplissage.

En fait, à chaque fois que j'affiche mon DataGridView j'ai le balayage.
Par exemple, si mon application est masquée et que je la passe au premier plan, paf, ça bloque l'ordinateur le temps de l'affichage en balayage du tableau. Ca bloque même avec Alt+Tab.

Je précise aussi que sur tous les autres postes testés il n'y a aucun problème, tout s'affiche très rapidement.

A+
0
cs_lexouille Messages postés 4 Date d'inscription lundi 28 avril 2003 Statut Membre Dernière intervention 2 octobre 2009
25 mai 2009 à 11:16
Bonjour à tous !

J'ai enfin trouvé un solution au problème de rafraîchissement de mon DataGridView.
Le problème vient bien de la carte graphique. Apparemment seulement certaines nvidia seraient touchée.
Enfin bref, voici un billet qui explique qu'il faut surcharger la classe DataGridView, juste pour rajouter le double buffering. Fallait y penser !

http://stackoverflow.com/questions/118528/horrible-redraw-performance-of-the-datagridview-on-one-of-my-two-screens
0
BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 1
5 août 2009 à 16:50
Nickel, j'avais mis ce problème de coté, et j'y reviens, heureux de voir qu'il existait une solution . Encore fallait-il la trouver. Merci lexouille.

MisterMok
0
hd001 Messages postés 2 Date d'inscription jeudi 30 juillet 2009 Statut Membre Dernière intervention 2 octobre 2009
2 oct. 2009 à 00:21
0
BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 1
2 oct. 2009 à 07:33
heu merci .... ... ... mais quel rapport avec le problème de ce post ? (la solution n'y est même pas évoquée)

MisterMok
0
cs_lexouille Messages postés 4 Date d'inscription lundi 28 avril 2003 Statut Membre Dernière intervention 2 octobre 2009
2 oct. 2009 à 08:47
Je crois que c'est un spam le message de hd001 !


Lexouille
0
Rejoignez-nous