J'ai un cours
class Person{
public string Name {get; set;}
public string Surname {get; set;}
}
et un List<Person>
auquel j'ajoute quelques éléments. La liste est liée à mon DataGridView
.
List<Person> persons = new List<Person>();
persons.Add(new Person(){Name="Joe", Surname="Black"});
persons.Add(new Person(){Name="Misha", Surname="Kozlov"});
myGrid.DataSource = persons;
Il n'y a pas de problème. myGrid
affiche deux lignes, mais lorsque j'ajoute de nouveaux éléments à ma liste persons
, myGrid
n'affiche pas la nouvelle liste mise à jour. Il ne montre que les deux lignes que j'ai ajoutées auparavant.
Alors quel est le problème?
La reliure à chaque fois fonctionne bien. Mais lorsque je lie un DataTable
à la grille, chaque fois que je modifie DataTable
, il n’est pas nécessaire de relier myGrid
.
Comment le résoudre sans relier à chaque fois?
La liste n'implémente pas IBindingList
donc la grille ne connaît pas vos nouveaux éléments.
Liez votre DataGridView à un BindingList<T>
.
var list = new BindingList<Person>(persons);
myGrid.DataSource = list;
Mais je voudrais même aller plus loin et lier votre grille à un BindingSource
var list = new List<Person>()
{
new Person { Name = "Joe", },
new Person { Name = "Misha", },
};
var bindingList = new BindingList<Person>(list);
var source = new BindingSource(bindingList, null);
grid.DataSource = source;
Chaque fois que vous ajoutez un nouvel élément à la liste, vous devez relier votre grille. Quelque chose comme:
List<Person> persons = new List<Person>();
persons.Add(new Person() { Name = "Joe", Surname = "Black" });
persons.Add(new Person() { Name = "Misha", Surname = "Kozlov" });
dataGridView1.DataSource = persons;
// added a new item
persons.Add(new Person() { Name = "John", Surname = "Doe" });
// bind to the updated source
dataGridView1.DataSource = persons;
Oui, il est possible de faire sans reliure en implémentant l'interface INotifyPropertyChanged.
Pretty Simple exemple est disponible ici,
http://msdn.Microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx
Après avoir ajouté un nouvel élément à persons
, ajoutez:
myGrid.DataSource = null;
myGrid.DataSource = persons;