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 :

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;
			}	
		}
jusque là je n'ai pas de problème l'affichage du datagridview ce passe bien.

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:

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();
		}
et là j'obtiens de manière aléatoire l'erreur suivante :

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

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

En tous cas, merci pour votre aide et éclaircissement à venir.