Interfaces participant à la liaison de données
Mise à jour : novembre 2007
Avec ADO.NET, vous pouvez créer de nombreuses structures de données différentes pour répondre aux besoins de liaison de votre application et des données avec lesquelles vous travaillez. Vous pouvez créer vos propres classes qui fournissent ou consomment des données dans les Windows Forms. Ces objets peuvent offrir divers niveaux de fonctionnalités et de complexité, de la liaison de données de base à la prise en charge du mode design, la vérification des erreurs, la notification des modifications et même une prise en charge de la restauration structurée des modifications apportées aux données elles-mêmes.
Consommateurs d'interfaces de liaison de données
Les sections suivantes décrivent deux groupes d'objets d'interface. Le premier groupe rassemble les interfaces qui sont implémentées sur les sources de données par les auteurs de source de données. Ces interfaces sont conçues pour être consommées par les consommateurs de source de données qui sont, dans la plupart des cas, des contrôles ou des composants Windows Forms. Le second groupe répertorie les interfaces conçues pour être utilisées par les auteurs du composant. Les auteurs du composant utilisent ces interfaces lorsqu'ils créent un composant qui prend en charge la liaison de données à consommer par le moteur de liaison de données Windows Forms. Vous pouvez implémenter ces interfaces dans les classes associées à votre formulaire pour activer la liaison de données. Chaque cas présente une classe qui implémente une interface qui active l'interaction avec les données. Les outils d'expérience de design de données RAD (développement rapide d'application) Visual Studio tirent déjà parti de ces fonctionnalités.
Pour plus d'informations sur l'implémentation d'interfaces, consultez Implements, mot clé et instruction (Visual Basic) ou interface (Référence C#) (mot clé C#).
Interfaces pour implémentation par des auteurs de source de données
Les interfaces suivantes sont conçues pour être consommées par des contrôles Windows Forms :
l'interface IList.
Une classe qui implémente l'interface IList peut être un Array, ArrayList ou CollectionBase. Il s'agit de listes indexées d'éléments de type Object. Ces listes doivent contenir des types homogènes, car le premier élément de l'index en détermine le type. IList serait disponible pour une liaison uniquement au moment de l'exécution.
Remarque : Si vous souhaitez créer une liste d'objets métier à lier à des Windows Forms, envisagez d'utiliser le BindingList<T>. Le BindingList<T> est une classe extensible qui implémente les interfaces principales requises pour la liaison de données Windows Forms bidirectionnelle.
l'interface IBindingList.
Une classe qui implémente l'interface IBindingList offre un niveau plus élevé de fonctionnalités de liaison de données. Cette implémentation fournit des fonctions de tri de base et la notification des modifications à la fois lorsque les éléments de la liste changent (par exemple, le troisième élément présente un changement dans le champ Adresse dans une liste de clients), et lorsque la liste elle-même change (par exemple, le nombre d'éléments de la liste augmente ou diminue). La notification des modifications est importante si vous prévoyez d'avoir plusieurs contrôles liés aux mêmes données et que vous souhaitez que les changements de données faits dans un des contrôles se propagent aux autres contrôles dépendants.
Remarque : La notification de modifications est activée pour l'interface IBindingList via la propriété SupportsChangeNotification qui, lorsqu'elle est true, déclenche un événement ListChanged, indiquant que la liste a changé ou qu'un élément de la liste a changé.
Le type de modification est décrit par la propriété ListChangedType du paramètre ListChangedEventArgs. Ainsi, chaque fois que le modèle de données est mis à jour, chaque vue dépendante, comme d'autres contrôles liés à la même source de données, sera également mise à jour. Toutefois, les objets figurant dans la liste doivent avertir la liste de toute modification dont ils font l'objet afin que celle-ci puisse déclencher l'événement ListChanged.
Remarque : La BindingList<T> fournit une implémentation générique de l'interface IBindingList.
l'interface IBindingListView.
Une classe qui implémente l'interface IBindingListView fournit toutes les fonctionnalités d'une implémentation de IBindingList, ainsi que les fonctionnalités de filtrage et de tri avancées. Cette implémentation offre le filtrage basé sur chaîne et le tri multicolonne avec paires direction-descripteur de propriété.
l'interface IEditableObject.
Une classe qui implémente l'interface IEditableObject permet à un objet de déterminer le moment où les modifications apportées à cet objet deviennent permanentes. Cette implémentation vous permet de recourir aux méthodes BeginEdit, EndEdit et CancelEdit, qui vous autorisent à annuler des modifications apportées à l'objet. Ci-après une brève explication du fonctionnement des méthodes BeginEdit, EndEdit et CancelEdit et de la manière avec laquelle elles fonctionnent les unes avec les autres pour assurer la possibilité d'une restauration des données à leur état initial, après qu'elles aient été modifiées :
La méthode BeginEdit signale le début d'une modification d'un objet. Un objet qui implémente cette interface devra stocker les éventuelles mises à jour après l'appel de la méthode BeginEdit d'une manière telle que ces mises à jour puissent être annulées en cas d'appel de la méthode CancelEdit. Dans la liaison de données des Windows Forms, vous pouvez appeler BeginEdit à plusieurs reprises dans le cadre d'une seule et même transaction de modification (par exemple, BeginEdit, BeginEdit, EndEdit). Les implémentations de IEditableObject doivent garder trace d'informations telles que si BeginEdit a déjà été appelé et ignorer les appels ultérieurs à BeginEdit. Dans la mesure où il est possible d'appeler plusieurs fois cette méthode, il est essentiel que les appels suivants de celle-ci soient non destructeurs ; en d'autres termes, les appels de BeginEdit suivants ne peuvent pas détruire les mises à jour effectuées ni modifier les données enregistrées lors du premier appel de BeginEdit.
La méthode EndEdit envoie toute modification apportée depuis l'appel de BeginEdit à l'objet sous-jacent, si cet objet est actuellement en mode édition.
La méthode CancelEdit rejette toute modification apportée à l'objet.
Pour plus d'informations sur les méthodes BeginEdit, EndEdit et CancelEdit, consultez Vue d'ensemble de l'enregistrement de données.
L'aspect transactionnel des fonctionnalités de données est utilisé par le contrôle DataGridView.
l'interface ICancelAddNew.
Une classe qui implémente l'interface ICancelAddNew implémente habituellement l'interface IBindingList et vous permet de restaurer un ajout fait à la source de données avec la méthode AddNew. Si votre source de données implémente l'interface IBindingList, veillez à ce qu'elle implémente également l'interface ICancelAddNew.
l'interface IDataErrorInfo.
Une classe qui implémente l'interface IDataErrorInfo permet aux objets d'offrir des informations d'erreur personnalisées aux contrôles dépendants :
l'interface IEnumerable.
Une classe qui implémente l'interface IEnumerable est généralement consommée par ASP.NET. La prise en charge par Windows Forms de cette interface est uniquement disponible à travers le composant BindingSource.
Remarque : Le composant BindingSource copie tous les éléments IEnumerable dans une liste séparée, à des fins de liaison.
l'interface ITypedList.
Une classe de collections qui implémente l'interface ITypedList offre la possibilité de contrôler l'ordre et le jeu de propriétés exposées au contrôle dépendant.
Remarque : Lorsque vous implémentez la méthode GetItemProperties, et que le tableau PropertyDescriptor n'est pas nul, la dernière entrée dans le tableau sera le descripteur de propriété qui décrit la propriété de liste, qui est une autre liste d'éléments.
l'interface ICustomTypeDescriptor.
Une classe qui implémente l'interface ICustomTypeDescriptor fournit des informations dynamiques sur elle-même. Cette interface est semblable à ITypedList, mais est utilisée pour les objets plutôt que les listes. Cette interface est utilisée par DataRowView pour projeter le schéma des lignes sous-jacentes. Une implémentation simple de ICustomTypeDescriptor est fournie par la classe CustomTypeDescriptor.
Remarque : Pour prendre en charge la liaison au moment du design à des types qui implémentent ICustomTypeDescriptor, le type doit également implémenter IComponent et exister en tant qu'instance sur le formulaire.
l'interface IListSource.
Une classe qui implémente l'interface IListSource active la liaison basée sur liste sur des objets autres que listes. La méthode GetList de IListSource est utilisée pour retourner une liste pouvant être liée à partir d'un objet qui n'hérite pas de IList. IListSource est utilisée par la classe DataSet.
l'interface IRaiseItemChangedEvents.
Une classe qui implémente l'interface IRaiseItemChangedEvents est une liste pouvant être liée qui implémente également l'interface IBindingList. Cette interface est utilisée pour indiquer si votre type déclenche des événements ListChanged de type ItemChanged via sa propriété RaisesItemChangedEvents.
Remarque : Vous devez implémenter IRaiseItemChangedEvents si votre source de données assure la conversion de propriété en liste précédemment décrite et interagit avec le composant BindingSource. Sinon, le BindingSource exécutera également la conversion de propriété en liste, ce qui entraînera une baisse des performances.
l'interface ISupportInitialize.
Un composant qui implémente l'interface ISupportInitialize bénéficie des optimisations de lot pour définir les propriétés et initialiser les propriétés co-dépendantes. Le ISupportInitialize contient deux méthodes :
l'interface ISupportInitializeNotification.
Un composant qui implémente l'interface ISupportInitializeNotification implémente également l'interface ISupportInitialize. Cette interface vous permet de notifier d'autres composants ISupportInitialize que l'initialisation est terminée. L'interface ISupportInitializeNotification contient deux membres :
IsInitialized retourne une valeur boolean indiquant si le composant est initialisé.
Initialized se produit lorsque EndInit est appelé.
l'interface INotifyPropertyChanged.
Une classe qui implémente cette interface est un type qui déclenche un événement lorsqu'une de ses valeurs de propriété change. Cette interface est conçue pour remplacer le schéma obligeant à avoir un événement de modification pour chaque propriété d'un contrôle. Utilisé dans un BindingList<T>, un objet métier doit implémenter l'interface INotifyPropertyChanged et le BindingList'1 convertira des événements PropertyChanged en événements ListChanged de type ItemChanged.
Remarque : Pour que la notification de modifications se produise entre un client lié et une source de données, votre type de source-donnée liée doit implémenter l'interface INotifyPropertyChanged (de préférence) ou vous fournissez les événements propertyNameChanged pour le type dépendant, mais vous ne pouvez pas faire les deux à la fois.
Interfaces pour implémentation par des auteurs de composants
Les interfaces suivantes sont conçues pour être consommées par le moteur de liaison de données Windows Forms :
l'interface IBindableComponent.
Une classe qui implémente cette interface est un composant non-contrôle qui prend en charge la liaison de données. Cette classe retourne les liaisons de données et le contexte de liaison du composant à travers les propriétés DataBindings et BindingContext de cette interface.
Remarque : Si votre composant hérite de Control, vous n'avez pas besoin d'implémenter l'interface IBindableComponent.
l'interface ICurrencyManagerProvider.
Une classe qui implémente l'interface ICurrencyManagerProvider est un composant qui fournit son propre CurrencyManager pour gérer les liaisons associées à ce composant particulier. L'accès au CurrencyManager personnalisé est assuré par la propriété CurrencyManager.
Remarque : Une classe qui hérite de Control gère automatiquement les liaisons à travers sa propriété BindingContext, ce qui signifie que les cas dans lesquels vous devez implémenter le ICurrencyManagerProvider sont assez rares.
Voir aussi
Tâches
Comment : créer un contrôle à liaison simple dans un Windows Form
Concepts
Liaison de données et Windows Forms