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 persons
liste, 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 DataTable
j'apporte des modifications, il n'est pas nécessaire de relier myGrid
.
Comment le résoudre sans relier à chaque fois?
One
La manière est d'utiliser une BindingList, qui déclenchera un événement si la liste sous-jacente change. Une autre façon consiste à utiliser unBindingSource
et à appeler ResetBinding () chaque fois que vous ajoutez / supprimez une ligne, mais c'est beaucoup plus de travail. Si vous souhaitez informer la grille des modifications de propriété, le moyen le plus simple est de mettre en œuvreINotifyPropertyChanged
List<T>
si vous le souhaitez. Mais si vous ajoutez des éléments par programme à la liste, DataGridView ne le saura pas car vous n'implémentez pas la listeIBindingList
. Concernant BindingSource: J'utilise beaucoup winforms, et je ne me lie à rien d'autre qu'un BindingSource - FULLSTOP. Ajouter plus de détails est trop pour un commentaire, maisBindingSource
a tellement à offrir sans aucun inconvénient.Anyone who does not use a BindingSource for binding has not fully understood windows forms databindings
BindingSource
comme un pont entre votre source de données et votre interface graphique. Il résout de nombreux problèmes liés à la liaison de données. Vous souhaitez recharger vos données? Définissez simplementbindingSource.DataSource
votre nouvelle collection au lieu de relier chaque contrôle. Votre DataSource peut être nul? SetbindingSource.DataSource = typeof(YourClass)
Vous souhaitez avoir une grille modifiable mais votre source de données n'a pas de constructeur sans paramètre? Implémentez simplement l'bindingSource.AddingNew
événement et créez vous-même l'objet. Je n'ai jamais ressenti d'inconvénient lors de l'utilisation,BindingSource
mais de nombreux avantages.Chaque fois que vous ajoutez un nouvel élément à la liste, vous devez relier à nouveau votre grille. Quelque chose comme:
la source
Oui, il est possible de faire sans rebinding en implémentant l'interface INotifyPropertyChanged.
Un exemple assez simple est disponible ici,
http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx
la source
INotifyPropertyChanged
le DataGridView affichera toutes les modifications de propriété qui se produisent en arrière-plan, mais il ne saura pas si vous ajoutez / supprimez une ligne de votre source. Pour cela, il existe uneIBindingList
interface et, pour votre commodité, une implémentationBindingList<T>
qui l'implémente déjà, mais ne prend pas en charge le tri / filtrage.Après avoir ajouté un nouvel élément à
persons
ajouter:la source
null
si vous l'attribuez immédiatement àpersons
la ligne suivante?Ce n'est pas exactement le problème que j'ai eu, mais si quelqu'un cherche à convertir une BindingList de n'importe quel type en List du même type, voici comment procéder:
De plus, si vous affectez des BindingLists de types dynamiques à un DataGridView.DataSource, assurez-vous de le déclarer d'abord comme IBindingList afin que ce qui précède fonctionne.
la source