Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1180 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1045392
Gaxx
Posté le 13-04-2005 à 10:02:40  profilanswer
 

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
 
 
 
 

mood
Publicité
Posté le 13-04-2005 à 10:02:40  profilanswer
 

n°1045402
FlorentG
Posté le 13-04-2005 à 10:05:34  profilanswer
 

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

n°1045454
Gaxx
Posté le 13-04-2005 à 10:50:02  profilanswer
 

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...
 

n°1045466
FlorentG
Posté le 13-04-2005 à 10:56:13  profilanswer
 

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

n°1045617
Gaxx
Posté le 13-04-2005 à 11:51:23  profilanswer
 

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...

n°1045666
Gaxx
Posté le 13-04-2005 à 12:17:07  profilanswer
 

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.

n°1045760
FlorentG
Posté le 13-04-2005 à 13:42:49  profilanswer
 

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 :)

n°1046104
Gaxx
Posté le 13-04-2005 à 16:24:48  profilanswer
 

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.

n°1046109
FlorentG
Posté le 13-04-2005 à 16:27:07  profilanswer
 

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

n°1046121
Gaxx
Posté le 13-04-2005 à 16:30:08  profilanswer
 

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();  
 

mood
Publicité
Posté le 13-04-2005 à 16:30:08  profilanswer
 

n°1046125
FlorentG
Posté le 13-04-2005 à 16:32:06  profilanswer
 

Au fait, pourquoi utilise-tu des DataTable temporaires ?

n°1046140
Gaxx
Posté le 13-04-2005 à 16:42:55  profilanswer
 

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      |

n°1046153
FlorentG
Posté le 13-04-2005 à 16:52:33  profilanswer
 

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

n°1046213
Gaxx
Posté le 13-04-2005 à 17:10:35  profilanswer
 

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 ?

n°1046748
FlorentG
Posté le 13-04-2005 à 23:24:34  profilanswer
 

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

n°1047051
Gaxx
Posté le 14-04-2005 à 10:34:37  profilanswer
 

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%
...
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 

Sujets relatifs
Colorier une colonne de datagrid...[TomCat] Problème de context path tout bête
c++builder | Probleme de pilotage ole d'excel -> autofilterprobleme fichier css
Problème SNMPProblème de compression/parenthésage
problème avec le type TIMESTAMPprobleme de cookie chez free
probleme de connexion ODBCdebutant : Affichage variable dans url- problème d'accents
Plus de sujets relatifs à : [C#] DataGrid : problème incompréhensible


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR