Bonjour,

une DataGridView est bindée à une DataSource via un BindingSource.
A la fin du chargement des données par la DataGridView je souhaite masquer certaines lignes, celles d'index pairs par exemple.

Mais pour la toute première ligne une exception est levée :
InvalidOperationException : Row associated with the currency manager's position cannot be made invisible.
Une recherche sur Google donne une solution : suspendre le binding :
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
private void OnRowsAdded(object sender, EventArgs e)
{
	CurrencyManager cm = (CurrencyManager)this.DataGridView.BindingContext[DataGridView.DataSource];
 
	uint index = 0;
	foreach (DataGridViewRow row in this.DataGridView.Rows)
	{
		row.HeaderCell.Value = index.ToString();
		if (index % 2 == 0)
		{
			cm.SuspendBinding();
			row.Visible = false;
			cm.ResumeBinding();
		}
		index++;
	}
}
Mais cela ne change rien.

Google m'a aussi trouvé un hack qui est de mettre à null la propriété CurrentCell :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void OnRowsAdded(object sender, EventArgs e)
{
	DataGridView.CurrentCell = null;
	uint index = 0;
	foreach (DataGridViewRow row in this.DataGridView.Rows)
	{
		row.HeaderCell.Value = index.ToString();
		if (index % 2 == 0)
		{
			row.Visible = false;
		}
		index++;
	}
}
Ce hack fonctionne et donne le comportement attendu : pas d'exception et les bonnes lignes masquées.


Cela soulève plusieurs questions :

1) Pourquoi le problème se produit-il seulement pour la première ligne ?
2) Pourquoi dans ce cas suspendre le data binding ne fonctionne pas ?
3) Pourquoi le hack fonctionne ?



Merci d'avance.