Bonjour à tous, je rencontre un problème avec un datagridview que je n'arrive pas à résoudre seul. J'appelle donc à votre gentillesse et vos connaissance pour m'aider.
J'ai une list d'object qui comprend +/- 630.000 object.
j'affiche cette liste dans un datagridview de la manière suivante :
jusque là je n'ai pas de problème l'affichage du datagridview ce passe bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 public void SetMarks(List<Mark> lst) { if (lst.Count == 0 || lst == null) return; dtgv.CellFormatting += dtgv_CellFormatting; if (dtgv.Rows.Count != 0) { dtgv.DataSource = null; dtgv.Rows.Clear(); } dtgv.AutoGenerateColumns = false; dtgv.Columns[3].DataPropertyName = "Titre"; dtgv.Columns[4].DataPropertyName = "Link"; dtgv.Columns[7].DataPropertyName = "Description"; dtgv.Columns[8].DataPropertyName = "KeyWords"; dtgv.DataSource = lst; OnDataChanged(); } void dtgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { int colIndex = e.ColumnIndex; int rowIndex = e.RowIndex; Mark mk = dtgv.Rows[rowIndex].DataBoundItem as Mark; switch (colIndex) { case 1: dtgv.Rows[rowIndex].Cells[1].Style.BackColor = mk.CheckInfo.Couleur; break; case 2: dtgv.Rows[rowIndex].Cells[2].Value = mk.CheckInfo.CodeRetour; break; case 4: if(Helpers.UrlHlp.IsFromDarkWeb(mk.Link)) dtgv.Rows[rowIndex].Cells[4].Style.ForeColor = Color.Red; break; case 5: if(Helpers.FileHlp.UrlIsFile(mk.Link) == true) { dtgv.Rows[rowIndex].Cells[5].Value = " "; dtgv.Rows[rowIndex].Cells[5].Style.BackColor = Color.Black; } break; case 6: dtgv.Rows[rowIndex].Cells[6].Value = mk.CheckInfo.RedirectionURL; break; } }
Souhaitant supprimer tous les doublons de manière visible, je sélectionne toute les ligne (via un bouton) sauf une avec la procédure suivante:
et là j'obtiens de manière aléatoire l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 private void BtSelectAllClick(object sender, EventArgs e) { if(dtgv.Rows.Count == 0) return; string baseCompare = dtgv.Rows[0].Cells[dtgv.COLLINK].Value.ToString(); dtgv.SuspendLayout(); for(int i = 1; i < dtgv.Rows.Count ; i++) { if(dtgv.Rows[i].Cells[dtgv.COLLINK].Value.ToString() == baseCompare) dtgv.Rows[i].Selected = true; else baseCompare = dtgv.Rows[i].Cells[dtgv.COLLINK].Value.ToString(); } dtgv.ResumeLayout(); dtgv.Focus(); }
à System.Windows.Forms.DataGridViewTextBoxCell.Clone()
à System.Windows.Forms.DataGridViewRow.CloneCells(DataGridViewRow rowTemplate)
à System.Windows.Forms.DataGridViewRow.Clone()
à System.Windows.Forms.DataGridViewRowCollection.get_Item(Int32 index)
à NoDouble.Gui.Double.SelectAllButOne() dans i:\Perso C#\Webmark-IDEA\WebMark\WebMark\WebMark\Gui\Double.cs:ligne 109
à NoDouble.Gui.Double.BtSelectAllClick(Object sender, EventArgs e) dans i:\Perso C#\Webmark-IDEA\WebMark\WebMark\WebMark\Gui\Double.cs:ligne 94
à System.Windows.Forms.Control.OnClick(EventArgs e)
à System.Windows.Forms.Button.OnClick(EventArgs e)
à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
à System.Windows.Forms.Control.WndProc(Message& m)
à System.Windows.Forms.ButtonBase.WndProc(Message& m)
à System.Windows.Forms.Button.WndProc(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
à System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
la ligne 109 de double.cs est :
La question est donc comment empêcher l'erreur OutOfMemory et comment se fait-il qu'elle se produise puisque l'affichage du datagridview se fait correctement ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if(dtgv.Rows[i].Cells[dtgv.COLLINK].Value.ToString() == baseCompare) dtgv.Rows[i].Selected = true; else baseCompare = dtgv.Rows[i].Cells[dtgv.COLLINK].Value.ToString();
En tous cas, merci pour votre aide et éclaircissement à venir.
Partager