[C#] DataGrid : problème incompréhensible

DataGrid : problème incompréhensible [C#] - C#/.NET managed - Programmation

Marsh Posté le 13-04-2005 à 10:02:40    

Bonjour,
 
J’ai un soucis de mise à jour de datagrid (validation d'ajout de lignes dans le datatable correspondant) : dans mon programme j’utilise 3 datagrid, à chaque datagrid correspond un dataset en variable d’instance. Pour le remplissage et la mise à jour de mes datagrid j’utilise systématiquement un datatable temporaire défini dans mes fonctions.
 
Le remplissage de mes datagrid se fait sans erreurs mais pour l’un des trois datagrid mon programme met un temps relativement long. Cela se passe toujours sur le même datagrid quelque soit l’odre de remplissage des datagrid. Mon programme freeze et le proc est utilisé à fond (50% sur un P-IV HT) puis fini l’affichage.
Par contre, ma mise à jour se fait normalement (aucun freeze).
 
Mon problème n’est pas bloquant mais il est gênant et semble être corrigible.
 
Si quelqu'un peut m'aider à trouver le problème...
Par avance merci,
Gaxx
 
 
 
 

Reply

Marsh Posté le 13-04-2005 à 10:02:40   

Reply

Marsh Posté le 13-04-2005 à 10:05:34    

Envoi au moins un bout de code du remplissage de tes datagrids, ça aidera ;)

Reply

Marsh Posté le 13-04-2005 à 10:50:02    

Yep, voilà :  
 

Code :
  1. private void remplirComposantsGraphiques()
  2. {
  3. Cursor.Current = Cursors.WaitCursor;
  4. int zar=1;
  5. Console.WriteLine("remplirComposantsGraphiques" );
  6. #region Déclarations
  7. System.Data.DataTable dtTmp;
  8. IEnumerator ienum;
  9. String stmp;
  10. String[] stmp2;
  11. #endregion Déclarations
  12. Console.WriteLine("FGTrans_dgDocAEmettre" );
  13. #region FGTrans_dgDocAEmettre
  14. dtTmp = dsDAE.Tables["Documents à émettre"];
  15. dtTmp.Clear();
  16. dtTmp.BeginLoadData();
  17. if(htADAE.ContainsKey(htA[FGTrans_cbActivité.SelectedItem.ToString()]))
  18. {
  19. ienum = ((ArrayList)htADAE[htA[FGTrans_cbActivité.SelectedItem.ToString()]]).GetEnumerator();
  20. while(ienum.MoveNext())
  21. {
  22. int zor=1;
  23.  stmp=ienum.Current.ToString();
  24.  stmp2=(String[])htDAE[stmp];
  25. Console.WriteLine("ienum.MoveNext()..."+zar+"-"+zor++);
  26.  dtTmp.Rows.Add( new Object[]{ false, stmp, stmp2[0], stmp2[1], stmp2[2], stmp2[3] } ); //["N° Type Objet Contact Date]
  27. /*
  28.  dtTmp.Rows.Add( new Object[]{ false, "", "", "", "", "" } ); //["N° Type Objet Contact Date]
  29.  DataRow drTmp=dtTmp.NewRow();
  30.  drTmp["Choisir"]=false;
  31.  drTmp["N°"]="";
  32.  drTmp["Type"]="";
  33.  drTmp["Objet"]="";
  34.  drTmp["Contact"]="";
  35.  drTmp["Date"]="";
  36.  dtTmp.Rows.Add(drTmp);
  37. */
  38. Console.WriteLine("ienum.MoveNext()..."+zar+++"-"+zor++);
  39. }
  40. }
  41. dtTmp.EndLoadData();
  42. if(dtTmp.Rows.Count!=0)
  43. {
  44. FGTrans_bEmettreDocAEmettre.Enabled = true;
  45. FGTrans_bVoirDocAEmettre.Enabled = true;
  46. }
  47. else
  48. {
  49. FGTrans_bEmettreDocAEmettre.Enabled = false;
  50. FGTrans_bVoirDocAEmettre.Enabled = false;
  51. }
  52. #endregion FGTrans_dgDocAEmettre
  53. // Là je passe à un autre datagrid
  54. Console.WriteLine("FGTrans_dgDocEmis" );
  55. ...
  56. Console.WriteLine("fini" );
  57. Cursor.Current = Cursors.Default;
  58. }


 
Le comportement est le suivant :  
Affichage en boucle de la ligne : « Console.WriteLine("ienum.MoveNext()..."+zar+++"-"+zor++); »  
Freeze du programme et travail processeur
Affichage de la ligne : « Console.WriteLine("FGTrans_dgDocEmis" ); »
Et le reste sans problèmes jusqu'à l'avant dernière ligne de ma fonction où j'affiche "Fini"
 
J'ai essayé la mise à jour de trois manières différentes (deux sont commentées), avec et sans type booléen et rien n'y fait.
 
Je peux mettre aussi la déclaration du DataTable s'il faut...
 

Reply

Marsh Posté le 13-04-2005 à 10:56:13    

Et avec un Profiler, c'est quelle instruction qui prend des plombes ?

Reply

Marsh Posté le 13-04-2005 à 11:51:23    

FlorentG a écrit :

Et avec un Profiler, c'est quelle instruction qui prend des plombes ?


Hummm je vais d'abord chercher ce qu'est un Profiler...

Reply

Marsh Posté le 13-04-2005 à 12:17:07    

Gaxx a écrit :

Hummm je vais d'abord chercher ce qu'est un Profiler...


Trouvé via ce topic :
http://forum.hardware.fr/forum2.ph [...] subcat=405
 
 
DL lancé, je testerai cet après midi.

Reply

Marsh Posté le 13-04-2005 à 13:42:49    

Tu peux essayer NProf, mais qui donne des temps d'exécution en pourcentages, et non en ms, donc faut bien faire gaffe. Mais ça aide pas mal à trouver ce qui va pas :)

Reply

Marsh Posté le 13-04-2005 à 16:24:48    

Le profiler de DevPartner me dit que le maillon faible est :
Count | % with children | Time  | Source
15    | 1,4             |4778,3 | dtTmp.Rows.Add( new Object[]{ false, stmp, stmp2[0], stmp2[1], stmp2[2], stmp2[3] } );
 
Il l'a marque en rouge.

Reply

Marsh Posté le 13-04-2005 à 16:27:07    

Avec nprof, tu peux voir le détail, aller très profond dans les fonctions appellée, histoire de voir laquelle est vraiment fautive :)

Reply

Marsh Posté le 13-04-2005 à 16:30:08    

FlorentG a écrit :

Avec nprof, tu peux voir le détail, aller très profond dans les fonctions appellée, histoire de voir laquelle est vraiment fautive :)


Je vais le DL pour voir.
 
En décomposant le remplissage colonne par colonne, le pb vient de  
15 1,4 4631,3                     DataRow drTmp=dtTmp.NewRow();  
 

Reply

Marsh Posté le 13-04-2005 à 16:30:08   

Reply

Marsh Posté le 13-04-2005 à 16:32:06    

Au fait, pourquoi utilise-tu des DataTable temporaires ?

Reply

Marsh Posté le 13-04-2005 à 16:42:55    

FlorentG a écrit :

Au fait, pourquoi utilise-tu des DataTable temporaires ?


Bah parceque je préfères gérer mes accès à la bdd en code plutôt qu'avec les assistants, et donc je n'ai que mes datagrid sur l'interface. Et les dataset sont des variables d'instance de la form.
 
 
Dans ma fonction qui remplit mes datagrid, nprof me donne cela :  
Signature                                 | # of calls | % of total | %of parent |
void System.Data.DataTable::EndLoadData() | 6          | 21.09      | 99.04      |

Reply

Marsh Posté le 13-04-2005 à 16:52:33    

Mouais, j'vois pas trop l'interêt :/

Reply

Marsh Posté le 13-04-2005 à 17:10:35    

FlorentG a écrit :

Mouais, j'vois pas trop l'interêt :/


 
Je ne pense pas que mon choix soit meilleur que de passer l'assistant mais je construit mes requêtes moi même, et donc je sais ce qui transite par le réseau.
Je me suis basé sur un autre projet que j'avais fait en gardant la même méthode. A l'époque le base que j'utilisait était tellement bordélique que j'avais préféré faire mes requêtes moi même.
 
Une idée pour le ralentissement ?

Reply

Marsh Posté le 13-04-2005 à 23:24:34    

En fait je voulais dire pourquoi ne fout-tu pas la table directement comme DataSource du DataGrid, ou un DataView associé ?
 
Sinon y'a combien d'enregistrements ? Parce que EndLoadData réactive certains trucs comme les contraintes, du coup le machin s'amuse à tester chaque ligne pour voir si les contraintes sont respectées

Reply

Marsh Posté le 14-04-2005 à 10:34:37    

FlorentG a écrit :

En fait je voulais dire pourquoi ne fout-tu pas la table directement comme DataSource du DataGrid, ou un DataView associé ?Sinon y'a combien d'enregistrements ? Parce que EndLoadData réactive certains trucs comme les contraintes, du coup le machin s'amuse à tester chaque ligne pour voir si les contraintes sont respectées


 
Bah parceque je voulais respecter ce que je croyais être les règles ... Il va falloir que je reprenne mon code pour virer tous mes DataSet inutiles !
 
En passant directement le datatable au DataGrid rien ne change, de même en virant BeginLoadData et EndLoadData j'ai le même ralentissement.  
Mais là je pense que ça vient du tri effectué lors des insertions.
 
Parcours en profondeur des fonctions à gros temps d'exécution :
remplirComposantsGraphiques()
DataRowCollection.Add() : 99.33% of parent
DataTable.AddRow() : 99.90%
DataTable.InsertRow() : 99.98%
DataTable.SetNewRecord() : 99.91%
DataTable.RecordStateChanged() : 99.81%
Data.Index.RecordStateChanges() : 99.99%
Data.Index.ApplyChangeAction() : 99.98%
Data.Index.InsertRecord() : 99.96%
Data.Index.OnListChanged() : 99.99%
DataViexListener.IndexListChanged() : 99.99%
...
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed