web-dev-qa-db-fra.com

List <T> vs BindingList <T> Avantages / Inconvénients

Quelqu'un peut-il décrire la différence entre les deux pour mon projet?.

Actuellement, j'ai un List<MyClass> Et défini le BindingSource à cela et un DataGridView au BindingSource.

J'ai implémenté IEditableObject donc quand CancelEdit est appelé, je ramène mon objet à ce qu'il était avec une Memberwise.Clone()

Est-ce que changer ma liste en BindingList résoudra tout cela et quels sont les avantages d'utiliser une BindingList?

83
Jon

UNE List<> est simplement un tableau de redimensionnement automatique, d'éléments d'un type donné, avec quelques fonctions d'assistance (par exemple: sort). Ce ne sont que les données, et vous êtes susceptible de les utiliser pour exécuter des opérations sur un ensemble d'objets dans votre modèle.

UNE BindingList<> est un wrapper autour d'une liste typée ou d'une collection, qui implémente l'interface IBindingList. Il s'agit de l'une des interfaces standard qui prennent en charge la liaison de données bidirectionnelle. Il fonctionne en implémentant l'événement ListChanged, qui est déclenché lorsque vous ajoutez, supprimez ou définissez des éléments. Les contrôles liés écoutent cet événement afin de savoir quand actualiser leur affichage.

Lorsque vous définissez le DataSource d'un BindingSource sur un List<>, il crée en interne un BindingList<> pour boucler votre liste. Vous voudrez peut-être pré-envelopper votre liste avec un BindingList<> vous-même si vous souhaitez y accéder en dehors du BindingSource, mais sinon c'est la même chose. Vous pouvez également hériter de BindingList<> pour implémenter un comportement spécial lors du changement d'éléments.

IEditableObject est géré par la BindingSource. Il appellera BeginEdit sur n'importe quel objet d'implémentation lorsque vous modifiez les données dans n'importe quel contrôle lié. Vous pouvez ensuite appeler EndEdit/CancelEdit sur le BindingSource et il le transmettra à votre objet. Passer à une autre ligne appellera également EndEdit.

116
Alex J

Une BindingList permet une liaison de données bidirectionnelle en utilisant des événements, une liste ne déclenche pas d'événements lorsque sa collection change.

Je ne pense pas que cela réglera votre problème particulier.

11
Gerrie Schenck