104 votes

Lier List<T> à DataGridView dans WinForm

J'ai une classe

class Person{
      public string Name {get; set;}
      public string Surname {get; set;}
}

et un List<Person> à laquelle 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 rangées, mais lorsque j'ajoute de nouveaux éléments à mes persons liste, myGrid ne montre pas la nouvelle liste mise à jour. Elle n'affiche que les deux lignes que j'ai ajoutées auparavant.

Quel est donc le problème ?

Le rebranchement à chaque fois fonctionne bien. Mais lorsque je lie un DataTable à la grille quand à chaque fois que je fais des changements à DataTable il n'y a pas besoin de ReBind myGrid .

Comment le résoudre sans rebondir à chaque fois ?

209voto

SchlaWiener Points 9682

La liste ne met pas en œuvre IBindingList pour que la grille ne soit pas au courant de vos nouveaux éléments.

Liez votre DataGridView à un BindingList<T> à la place.

var list = new BindingList<Person>(persons);
myGrid.DataSource = list;

Mais j'irais même plus loin et je lierais votre grille à une 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;

4voto

Dimitar Dimitrov Points 6551

Chaque fois que vous ajoutez un nouvel élément à la liste, vous devez lier à nouveau 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;

3voto

Dev Points 870

Oui, il est possible de faire sans rebondir en implémentant l'interface INotifyPropertyChanged.

Un exemple assez simple est disponible ici,

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

0voto

Rafal Points 1116

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

myGrid.DataSource = null;
myGrid.DataSource = persons;

0voto

Kopfs Points 1

Ce n'est pas exactement le problème que j'ai rencontré, mais si quelqu'un cherche à convertir une BindingList de n'importe quel type en liste du même type, voici comment procéder :

var list = bindingList.ToDynamicList();

En outre, si vous affectez des BindingLists de types dynamiques à une DataGridView.DataSource, assurez-vous de la déclarer d'abord en tant que IBindingList pour que les éléments ci-dessus fonctionnent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X