web-dev-qa-db-fra.com

Liaison Liste <T> à DataGridView dans WinForm

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?

82
namco

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;
162

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;
3
Dimitar Dimitrov

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

1
Dev

Après avoir ajouté un nouvel élément à persons, ajoutez:

myGrid.DataSource = null;
myGrid.DataSource = persons;
1
Rafal