Pourquoi mon DataGridView scintille (colonne rétrécissent et reprennen

Pourquoi mon DataGridView scintille (colonne rétrécissent et reprennen - C#/.NET managed - Programmation

Marsh Posté le 15-05-2023 à 19:42:46    

Salut a tous,
 
J'ai un Datagridview qui reçoit des données externe et j'ai rajouté 3 colonnes independantes des données externes
 
Ma datagridview se rafraichit toutes les 3 secondes et lors du rafraissichement le tableau scintille (c'est a dire que les cellules rétrécissent et reprennent leur tailles d'origine) et aussi le contenu des 3 colonnes independantes (celles ajoutées) disparait et reapparait.
 
J'ai ce probleme avec cet ajout de code (voir ci-dessous qui correpond a une colone ajouté), si je supprime ce bout de code le probleme disparait :
 

Code :
  1. var id = row.Cells[0].Value.ToString();
  2.                             var nickNameTask = Task.Run<string>(async() => await this.GetTraderName(id));
  3.                             nickNameTask.Wait();
  4.                             string nickName = nickNameTask.Result;
  5.                             row.Cells[1].Value =nickName;


 
Savez vous d'ou peut venir le probleme et comment le corrigé?
 
Voici le code :
 

Code :
  1. private void dtgvPositions_DataBindingComplete(
  2.           object sender,
  3.           DataGridViewBindingCompleteEventArgs e)
  4.         {
  5.             List<string> lstUID = this.ReplaceDownTheLine(this.txtUIDs.Text.Trim());
  6.             Dictionary<string, bool> lstUIDColor = new Dictionary<string, bool>();
  7.             for (int index = 0; index < lstUID.Count; ++index)
  8.                 lstUIDColor.Add(lstUID[index], index % 2 == 0);
  9.             this.dtgvPositions.Invoke((Action)(() =>
  10.             {
  11.                 foreach (string str in lstUID)
  12.                 {
  13.                     foreach (DataGridViewRow row in (IEnumerable)this.dtgvPositions.Rows)
  14.                     {
  15.                         string key  = row.Cells[0].Value.ToString();
  16.                         Decimal num = 0M;
  17.                         Decimal num1 = 0M;
  18.                         Decimal num2 = 0M;
  19.                         Decimal num3 = 0M;
  20.                         try
  21.                         {
  22.                             num  = Decimal.Parse(row.Cells[9].Value.ToString());
  23.                             num1 = Decimal.Parse(row.Cells[5].Value.ToString());
  24.                             num2 = Decimal.Parse(row.Cells[7].Value.ToString());
  25.                             num3 = Decimal.Parse(row.Cells[3].Value.ToString());
  26.                             var id = row.Cells[0].Value.ToString();
  27.                             var nickNameTask = Task.Run<string>(async() => await this.GetTraderName(id));
  28.                             nickNameTask.Wait();
  29.                             string nickName = nickNameTask.Result;
  30.                             row.Cells[1].Value =nickName;
  31.                             bool flag;
  32.                             lstUIDColor.TryGetValue(key, out flag);
  33.                             row.DefaultCellStyle.BackColor = Color.FromArgb(24, 26, 32);
  34.                             row.Cells[1].Selected = false;
  35.                             row.Cells[1].Style.ForeColor = flag ? Color.LightSkyBlue : Color.LightPink;
  36.                             row.Cells[2].Value = num1 >= 0M ? "Long" : "Short";
  37.                             row.Cells[2].Style.ForeColor = num1 >= 0M ? Color.FromArgb(22, 181, 93) : Color.FromArgb(194, 52, 54);
  38.                             row.Cells[6].Value = (num1 * num2) / num3;
  39.                             row.Cells[9].Style.ForeColor = num >= 0M ? Color.FromArgb(22, 181, 93) : Color.FromArgb(194, 52, 54);
  40.                             row.Cells[10].Style.ForeColor = num >= 0M ? Color.FromArgb(22, 181, 93) : Color.FromArgb(194, 52, 54);
  41.                         }
  42.                         catch
  43.                         {
  44.                         }
  45.                     }
  46.                 }
  47.             }));
  48.         }


 
Merci

Reply

Marsh Posté le 15-05-2023 à 19:42:46   

Reply

Marsh Posté le 16-05-2023 à 09:00:56    

Dans le DataGrid y a pas des méthodes du genre BeginUpdate / EndUpdate ou SuspendDrawing / ResumeDrawing à appeler avant de balancer des trucs dedans que tu aurais oublié ?  
 
Tu n'aurais pas du Autosize quelque part qui réagit ?


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 17-05-2023 à 13:20:05    

Bonjour et merci, non il a rien de ça

Reply

Marsh Posté le 17-05-2023 à 14:47:12    

Tu as essayé de créer un DatagridView avec le double buffer d'activé ?

 

https://learn.microsoft.com/en-us/d [...] esktop-7.0

 

DoubleBuffered est un attribut protected, tu dois donc créer une classe qui héritera de DatagridView pour l'initialiser :

 
Code :
  1. class DoubleBufferedDataGridView : DataGridView
  2. {
  3.    public DoubleBufferedDataGridView () { DoubleBuffered = true; }
  4. }


Message édité par Harkonnen le 17-05-2023 à 14:47:42

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 17-05-2023 à 15:59:23    

Merci Harkonnen, je vais essayé et je vous tiens au couran..

Reply

Marsh Posté le 17-05-2023 à 16:12:25    

Ca se tente, mais j'imagine que si MS a masqué cette propriété c'est pas pour rien :D. Après c'est peut être juste pour une histoire de mémoire consommée.
 
Pour éviter de surcharger complètement la classe du contrôle, on doit aussi pouvoir bricoler ça par reflection, qqch du genre :
 

Code :
  1. typeof(DataGridView).InvokeMember(
  2.    nameof(DataGridView.DoubleBuffered),
  3.    BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
  4.    null,
  5.    gridview,
  6.    new object[] { true });


 
Au chargement de la form (code non testé, c'est pour l'exemple)
 
Les deux solutions sont un peu moches mais celle là évite de créer une nouvelle classe.


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 17-05-2023 à 19:24:22    

Alors pour le retour, les 2 solutions n'ont pas foctionner.
Merci

Reply

Sujets relatifs:

Leave a Replay

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