Au fil des flows

15jan/120

Mettre à jour les donnees dans un controle de type DatagridView

Posted by Fabien Arcellier

A l'origine, je voulais varier les plaisir et publier un billet concernant un code C sous linux utilisant la librairie GTK. Finalement, par manque de temps, j'ai décidé de poster une des notes techniques concernant Winform que j'avais de coté.

C'est quelque chose de déroutant quand on commence à travailler en .NET.

Il n'existe aucune methode sur un composant DataGridView permettant de forcer le composant à recharger sa source de donnée.

Solution simple mais deconseillee

En faite, le controle charge la source de donnée lors de l'affectation de celle ci, si l'objet donne en temps que source a un hash code different. Donc, pour le force à se recharger, il faut changer sa source de donnée par null et lui reaffecter la source precedente

this.DataGridView_MainSplitter_LocksList.DataSource = null;
this.DataGridView_MainSplitter_LocksList.DataSource = this.ListCylindres;

Pourquoi ne pas employer cette methode ?

Le controle DatagridView est construit pour gérer des sources de données assez conséquente. Le mettre entièrement à jour est totalement contre productif. Une lettre qui change dans un mot impliquerait de recharger entièrement ce controle.

Il suffit de penser différemment. En effet, c'est la source de données qui remonte la modification jusqu'au DatagridView.

Une solution plus elegante

Le plus souvent, on utilisera comme source de donnée une classe générique List pour contenir nos données.

public class CylindreList : List<Cylindre>
{
}

Dans le namespace System.ComponentModel, il existe un équivalent BindingList qui possede la particularité d'hériter de la classe BindingSource. Cette classe offre le même service que la classe List. En complément, dès qu'un objet de la liste est modifié, elle émet un évenement indiquant le changement apporté.

public class CylindreList : BindingList<Cylindre>
{
}

Dès qu'un élément est ajouté ou retiré à cette liste de donnée, la DataGridView qui embarque cette source sera mis à jour.

Attention : Si l'objet référencé par une liste est modifiée, la liste ne remontera pas les modifications. Pour faire remonter les modifications, il faut que l'objet implemente l'interface INotifyPropertyChanged : Voir article sur CodeProject.

Remplis sous: Non classé Aucun commentaire