2017-10-12 3 views
-1
For Each drow As DataGridViewRow In DgvItemList.Rows 
      drow.Cells("strSrNo").Value = drow.Index + 1 
     Next 

J'ai plus de 3500 enregistrements dans DgvItemList. Je donne simplement une numérotation à ces documents, mais cela donne 9 à 10 minutes pour cela.La boucle prend environ 10 minutes en vb

Comment réduire cette période?

+0

https://stackoverflow.com/questions/5817632/beginupdate-endupdate-for-datagridview-request, peut-être? Cependant, les messages Windows le rendent spécifique à Windows. – Ryan

+0

comment faire ceci? – Bhoomi

+0

Qu'essayez-vous réellement de faire? Comme dans: * pourquoi * avez-vous besoin d'affecter ce qui ressemble à une sorte de numéro de série à des données qui sont déjà dans la grille? EDIT: aussi, votre grille est-elle liée à un DataTable ou à quelque chose? –

Répondre

2

Deux choses. Chaque fois que vous changez la valeur, cela pourrait le faire DataGridView de mettre à jour, donc juste avant votre boucle, ajouter

DgvItemList.SuspendLayout 

et après la boucle, ajouter

DgvItemList.ResumeLayout 

Vous pouvez également changer la boucle à un Parallel.For boucle, de sorte que votre code final serait quelque chose comme

DgvItemList.SuspendLayout 
Parallel.For(0, DgvItemList.Rows.Count, Sub(index As Integer) 
             DgvItemList.Rows(index).Cells("strSrNo").Value = DgvItemList.Rows(index).Index + 1 
              End Sub) 
DgvItemList.ResumeLayout 

Essayez avec juste la mise en page Suspension et reprise en premier. Vous ne pouvez pas obtenir une grande quantité d'amélioration de la parallélisation. Cela vaut la peine d'y aller.

+0

Ne devrait pas mettre fin à la condition du parallèle.Pour être le nombre de lignes moins 1? – dwilliss

+0

Je n'ai jamais utilisé 'Parallel.For', mais cela ne vous oblige-t-il pas à invoquer lors de l'accès à l'interface utilisateur, comme avec les tâches/tâches régulières? –

+0

@dwilliss no. Juste pour confondre les gens, une boucle normale for.next say de 0 à 100 bouclera 101 fois, mais une boucle parallel.for ne s'exécutera que de 0 à 99, donc vous n'avez pas besoin de soustraire 1 de la valeur de fin dans le cas d'index à base zéro. De l'autre côté de la médaille bien sûr, si la fin de votre boucle est obtenue à partir de array.getupperbound, vous devrez peut-être ajouter 1 –