Partager via


Vue d’ensemble de la liaison de données avec Windows Forms

Dans Windows Forms, vous pouvez établir une liaison à des sources de données non seulement traditionnelles, mais également à presque n’importe quelle structure qui contient des données. Vous pouvez établir une liaison à un tableau de valeurs que vous calculez au moment de l’exécution, lire à partir d’un fichier ou dériver des valeurs d’autres contrôles.

En outre, vous pouvez lier n’importe quelle propriété de n’importe quel contrôle à la source de données. Dans la liaison de données traditionnelle, vous liez généralement la propriété d’affichage (par exemple, la propriété Text d’un contrôle TextBox) à la source de données. Avec .NET, vous avez également la possibilité de définir d’autres propriétés par le biais de la liaison. Vous pouvez utiliser des liaisons pour effectuer les tâches suivantes :

  • Définir le graphisme d'un contrôle d'image.

  • Définition de la couleur d’arrière-plan d’un ou de plusieurs contrôles.

  • Définition de la taille des contrôles.

Essentiellement, la liaison de données est un moyen automatique de définir n’importe quelle propriété accessible au moment de l’exécution d’un contrôle sur un formulaire.

ADO.NET vous permet de créer de nombreuses structures de données différentes pour répondre aux besoins de liaison de votre application et aux données avec lesquelles vous travaillez. Vous pouvez créer vos propres classes qui fournissent ou consomment des données dans Windows Forms. Ces objets peuvent offrir différents niveaux de fonctionnalités et de complexité. De la liaison de données de base jusqu'à la prise en charge pendant la phase de conception, la vérification des erreurs, la notification des modifications, et même le soutien d’une 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 d’interface est implémenté sur les sources de données par les auteurs de sources de données. Les consommateurs de sources de données tels que les contrôles ou composants Windows Forms implémentent ces interfaces. Le deuxième groupe d’interface est conçu pour être utilisé par les auteurs de composants. Les auteurs de composants utilisent ces interfaces quand 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 au sein de classes associées à votre formulaire pour activer la liaison de données. Chaque cas présente une classe qui implémente une interface qui permet l’interaction avec les données. Les outils d’expérience de conception de données (RAD) de Visual Studio tirent déjà parti de cette fonctionnalité.

Interfaces pour l’implémentation par les auteurs de sources de données

Les contrôles Windows Forms implémentent les interfaces suivantes :

  • interface de IList

    Une classe qui implémente l’interface IList peut être un Array, ArrayListou CollectionBase. Il s’agit de listes indexées d’éléments de type Object et les listes doivent contenir des types homogènes, car le premier élément de l’index détermine le type. IList serait disponible uniquement pour la liaison au moment de l’exécution.

    Remarque

    Si vous souhaitez créer une liste d’objets métier pour la liaison avec Windows Forms, vous devez envisager d’utiliser le BindingList<T>fichier . Il BindingList s’agit d’une classe extensible qui implémente les interfaces principales requises pour la liaison de données Windows Forms bidirectionnelle.

  • interface de IBindingList

    Une classe qui implémente l’interface IBindingList fournit un niveau beaucoup plus élevé de fonctionnalités de liaison de données. Cette implémentation vous offre des fonctionnalités de tri de base et une notification de modification. Les deux sont utiles lorsque les éléments de liste changent et lorsque la liste elle-même change. La notification de modification est importante si vous envisagez d’avoir plusieurs contrôles liés aux mêmes données. Il vous permet d’apporter des modifications aux données apportées dans l’un des contrôles pour se propager aux autres contrôles liés.

    Remarque

    La notification de modification est activée pour l'interface IBindingList par la propriété SupportsChangeNotification, qui, lorsqu'elle est true, déclenche un événement ListChanged, signalant que la liste a changé ou qu'un élément de la liste a changé.

    Le type de modification est décrit par la ListChangedType propriété du ListChangedEventArgs paramètre. Par conséquent, chaque fois que le modèle de données est mis à jour, toutes les vues dépendantes, telles que d’autres contrôles liés à la même source de données, seront également mises à jour. Toutefois, les objets contenus dans la liste devront notifier la liste lorsqu’ils changent afin que la liste puisse déclencher l’événement ListChanged .

    Remarque

    BindingList<T> fournit une implémentation générique de l’interface IBindingList.

  • interface de IBindingListView

    Une classe qui implémente l’interface IBindingListView fournit toutes les fonctionnalités d’une implémentation, IBindingListainsi que le filtrage et les fonctionnalités de tri avancées. Cette implémentation offre un filtrage basé sur des chaînes de caractères et un tri à plusieurs colonnes avec des paires formées d'un descripteur de propriété et d'une direction.

  • interface de IEditableObject

    Une classe qui implémente l’interface IEditableObject permet à un objet de contrôler le moment où les modifications apportées à cet objet sont rendues permanentes. Cette implémentation prend en charge les méthodes BeginEdit, EndEdit, et CancelEdit qui vous permettent d'annuler les modifications apportées à l'objet. Voici une brève explication du fonctionnement des méthodes BeginEdit, EndEdit et CancelEdit et de la manière dont elles interagissent pour permettre une annulation potentielle des modifications apportées aux données :

    • La BeginEdit méthode signale le début d’une modification sur un objet. Un objet qui implémente cette interface doit stocker les mises à jour après l’appel de méthode BeginEdit de telle sorte que les mises à jour puissent être ignorées si la CancelEdit méthode est appelée. Dans les Windows Forms de liaison de données, vous pouvez appeler BeginEdit plusieurs fois dans l'étendue d'une transaction d'édition unique (par exemple, BeginEdit, BeginEdit, EndEdit). Les implémentations de IEditableObject doivent vérifier si BeginEdit a déjà été appelé et ignorer les appels ultérieurs à BeginEdit. Étant donné que cette méthode peut être appelée plusieurs fois, il est important que les appels suivants à celui-ci ne soient pas destructeurs. Les appels suivants BeginEdit ne peuvent pas détruire les mises à jour qui ont été apportées ou modifier les données enregistrées lors du premier BeginEdit appel.

    • La EndEdit méthode envoie (push) toutes les modifications depuis BeginEdit qu’elle a été appelée dans l’objet sous-jacent, si l’objet est actuellement en mode édition.

    • La CancelEdit méthode ignore les modifications apportées à l’objet.

    Pour plus d'informations sur le fonctionnement des méthodes BeginEdit, EndEdit, et CancelEdit, consultez Enregistrer les données dans la base de données.

    Cette notion transactionnelle de fonctionnalité de données est utilisée par le DataGridView contrôleur.

  • interface de ICancelAddNew

    Une classe qui implémente l’interface ICancelAddNew implémente généralement l’interface IBindingList et vous permet de restaurer un ajout effectué à la source de données avec la AddNew méthode. Si votre source de données implémente l'interface IBindingList, elle devrait également implémenter l'interface ICancelAddNew.

  • interface de IDataErrorInfo

    Une classe qui implémente l’interface IDataErrorInfo permet aux objets d’offrir des informations d’erreur personnalisées aux contrôles liés :

    • La Error propriété retourne le texte du message d’erreur général (par exemple, « Une erreur s’est produite »).

    • La Item[] propriété retourne une chaîne avec le message d’erreur spécifique de la colonne (par exemple, « La valeur de la State colonne n’est pas valide »).

  • interface de IEnumerable

    Une classe qui implémente l’interface IEnumerable est généralement consommée par ASP.NET. La prise en charge de Windows Forms pour cette interface est disponible uniquement via le BindingSource composant.

    Remarque

    Le BindingSource composant copie tous les IEnumerable éléments dans une liste distincte à des fins de liaison.

  • interface de ITypedList

    Une classe de collections qui implémente l’interface ITypedList fournit la fonctionnalité permettant de contrôler l’ordre et l’ensemble de propriétés exposées au contrôle lié.

    Remarque

    Lorsque vous implémentez la GetItemProperties méthode et que le PropertyDescriptor tableau n’est pas null, la dernière entrée du tableau est le descripteur de propriété qui décrit la propriété de liste qui est une autre liste d’éléments.

  • interface de ICustomTypeDescriptor

    Une classe qui implémente l’interface ICustomTypeDescriptor fournit des informations dynamiques sur elle-même. Cette interface est similaire à ITypedList, mais elle est utilisée pour les objets plutôt que pour les listes. Cette interface, utilisée par DataRowView, projette le schéma des lignes sous-jacentes. Une simple implémentation de ICustomTypeDescriptor est fournie par la classe CustomTypeDescriptor.

    Remarque

    Pour prendre en charge la liaison au moment du design aux types qui implémentent ICustomTypeDescriptor, le type doit également implémenter IComponent et exister en tant qu’instance sur le formulaire.

  • interface de IListSource

    Une classe qui implémente l’interface IListSource active la liaison basée sur la liste sur des objets non-list. La GetList méthode utilisée IListSource pour renvoyer une liste pouvant être liée à partir d’un objet qui n’hérite pas de IList. IListSource est utilisé par la DataSet classe.

  • interface de 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 ListChanged des événements de type ItemChanged via sa RaisesItemChangedEvents propriété.

    Remarque

    Vous devez implémenter si IRaiseItemChangedEvents votre source de données fournit la propriété pour répertorier la conversion d’événements décrite précédemment et interagir avec le BindingSource composant. Dans le cas contraire, la BindingSource propriété effectue également la conversion d’événements de liste, ce qui entraîne des performances plus lentes.

  • interface de ISupportInitialize

    Un composant qui implémente l’interface ISupportInitialize tire parti des optimisations par lots pour définir des propriétés et initialiser des propriétés dépendantes. Contient ISupportInitialize deux méthodes :

    • BeginInit signale que l’initialisation de l’objet démarre.

    • EndInit signale que l’initialisation de l’objet se termine.

  • interface de ISupportInitializeNotification

    Un composant qui implémente l’interface ISupportInitializeNotification implémente également l’interface ISupportInitialize . Cette interface vous permet d’informer d’autres ISupportInitialize composants que l’initialisation est terminée. L’interface ISupportInitializeNotification contient deux membres :

  • interface de INotifyPropertyChanged

    Une classe qui implémente cette interface est un type qui déclenche un événement lorsque l’une de ses valeurs de propriété change. Cette interface est conçue pour remplacer le modèle d’avoir un événement de modification pour chaque propriété d’un contrôle. Lorsqu'un objet métier est utilisé dans un BindingList<T>, il doit implémenter l’interface INotifyPropertyChanged et la BindingList`1 convertit les événements PropertyChanged en événements ListChanged de type ItemChanged.

    Remarque

    Pour que la notification de modification se produise dans une liaison entre un client lié et une source de données, votre type de source de données lié doit implémenter l’interface INotifyPropertyChanged (par défaut) ou vous pouvez fournir des événements propertyNameChanged pour le type lié, mais vous ne devez pas effectuer les deux.

Interfaces pour l’implémentation par les auteurs de composants

Les interfaces suivantes sont conçues pour être consommées par le moteur de liaison de données Windows Forms :

Sources de données prises en charge par Windows Forms

Traditionnellement, la liaison de données a été utilisée dans les applications pour tirer parti des données stockées dans des bases de données. Avec la liaison de données Windows Forms, vous pouvez accéder aux données à partir de bases de données et de données dans d’autres structures, telles que des tableaux et des collections, tant que certaines exigences minimales ont été satisfaites.

Structures à lier à

Dans Windows Forms, vous pouvez établir une liaison à une grande variété de structures, d’objets simples (liaison simple) à des listes complexes telles que des tables de données ADO.NET (liaison complexe). Pour une liaison simple, Windows Forms prend en charge la liaison aux propriétés publiques sur l’objet simple. La liaison basée sur la liste Windows Forms nécessite généralement que l’objet prenne en charge l’interface IList ou l’interface IListSource . De plus, si vous effectuez une liaison via un composant BindingSource, vous pouvez lier à un objet qui prend en charge l’interface IEnumerable.

La liste suivante montre les structures à laquelle vous pouvez établir une liaison dans Windows Forms.

  • BindingSource

    Une BindingSource est la source de données Windows Forms la plus courante et agit comme un proxy entre la source de données et des contrôles Windows Forms. Le modèle d’utilisation général BindingSource consiste à lier vos contrôles à BindingSource et à lier BindingSource à la source de données (par exemple, une table de données ADO.NET ou un objet métier). Le service BindingSource fournit des services qui permettent et améliorent le soutien pour la liaison de données. Par exemple, les contrôles Windows Forms basés sur des listes, tels que DataGridView et ComboBox, ne prennent pas directement en charge la liaison aux sources de données IEnumerable, mais vous pouvez faciliter ce scénario en effectuant la liaison via un BindingSource. Dans ce cas, la BindingSource source de données est convertie à un IList.

  • Objets simples

    Windows Forms prend en charge les propriétés de contrôle pour la liaison des données avec les propriétés publiques de l’instance de l’objet à l’aide du type Binding. Windows Forms prend également en charge les contrôles basés sur des listes de liaisons, comme un ListControl peut être lié à une instance d'objet lorsqu'un BindingSource est utilisé.

  • Tableau ou collection

    Pour agir en tant que source de données, une liste doit implémenter l’interface IList ; un exemple serait un tableau qui est une instance de la Array classe. Pour plus d’informations sur les tableaux, consultez Guide pratique pour créer un tableau d’objets (Visual Basic).

    En général, vous devez utiliser BindingList<T> lorsque vous créez des listes d’objets pour la liaison de données. BindingList est une version générique de l’interface IBindingList . L’interface IBindingList étend l’interface IList en ajoutant des propriétés, des méthodes et des événements nécessaires pour la liaison de données bidirectionnelle.

  • IEnumerable

    Les contrôles Windows Forms peuvent être liés à des sources de données qui prennent uniquement en charge l’interface IEnumerable s’ils sont liés via un BindingSource composant.

  • objets de données ADO.NET

    ADO.NET fournit de nombreuses structures de données adaptées à la liaison. Chacun varie dans sa sophistication et sa complexité.

    • DataColumn

      DataColumn est le bloc de construction essentiel d'un DataTable, car plusieurs colonnes constituent une table. Chacun DataColumn possède une DataType propriété qui détermine le type de données que contient la colonne (par exemple, la marque d’une voiture dans une table portant sur les voitures). Vous pouvez lier facilement un contrôle (par exemple, la propriété d’un TextBoxText contrôle) à une colonne au sein d’une table de données.

    • DataTable

      Un DataTable est la représentation d'une table, avec des lignes et des colonnes, dans ADO.NET. Une table de données contient deux collections : DataColumn, représentant les colonnes de données d’une table donnée (qui déterminent finalement les types de données pouvant être entrés dans cette table) et DataRow, représentant les lignes de données d’une table donnée. Vous pouvez lier un contrôle complexe aux informations contenues dans une table de données (par exemple, lier le DataGridView contrôle à une table de données). Toutefois, lorsque vous effectuez une liaison à un DataTable, vous liez à la vue par défaut de la table.

    • DataView

      DataView est une vue personnalisée d'une table de données unique qui peut être filtrée ou triée. Une vue de données est l'« instantané » des données utilisées par les contrôles liés complexes. Vous pouvez lier facilement ou complexement les données dans une vue de données, mais notez que vous vous liez à une « image » fixe des données plutôt qu’à une source de données propre et mise à jour.

    • DataSet

      Un DataSet est un ensemble de tables, de relations et de contraintes des données dans une base de données. Vous pouvez établir une liaison simple ou complexe aux données d’un jeu de données, mais notez que vous êtes lié à la valeur par défaut DataViewManager pour le DataSet (voir le point de puce suivant).

    • DataViewManager

      A DataViewManager est une vue personnalisée de l’ensemble DataSet, analogue à un DataView, mais avec des relations incluses. Avec une DataViewSettings collection, vous pouvez définir des filtres par défaut et des options de tri pour toutes les vues que DataViewManager possède pour une table donnée.

Types de liaison de données

Windows Forms peut tirer parti de deux types de liaison de données : liaison simple et liaison complexe. Chacun offre des avantages différents.

Type de liaison de données Descriptif
Liaison de données simple Capacité d’un contrôle à lier à un seul élément de données, tel qu’une valeur dans une colonne d’une table de jeu de données. La liaison de données simple est le type de liaison classique pour les contrôles tels que TextBox ou Label, qui n'affichent généralement qu'une seule valeur. En fait, toute propriété d’un contrôle peut être liée à un champ d’une base de données. Il existe une prise en charge étendue de cette fonctionnalité dans Visual Studio.

Pour plus d’informations, consultez Parcourir les données et créer un contrôle à liaison simple (Windows Forms .NET).
Liaison de données complexe Capacité d’un contrôle à lier à plusieurs éléments de données, généralement plusieurs enregistrements dans une base de données. La liaison complexe est également appelée liaison basée sur la liste. Les contrôles qui prennent en charge la liaison complexe sont les contrôles DataGridView, ListBoxet ComboBox. Pour obtenir un exemple de liaison de données complexe, consultez Guide pratique pour lier un contrôle ComboBox ou ListBox Windows Forms aux données.

Composant source de liaison

Pour simplifier la liaison de données, Windows Forms vous permet de lier une source de données au composant BindingSource, puis de lier des contrôles au BindingSource. Vous pouvez utiliser les BindingSource dans des scénarios de liaison simples ou complexes. Dans les deux cas, le BindingSource agit en tant qu'intermédiaire entre la source de données et les contrôles liés, fournissant la notification de changement, la gestion de devises, et d'autres services.

Scénarios courants qui utilisent la liaison de données

Presque toutes les applications commerciales utilisent des informations lues à partir de sources de données d’un type ou d’un autre, généralement via la liaison de données. La liste suivante présente quelques-uns des scénarios les plus courants qui utilisent la liaison de données comme méthode de présentation et de manipulation des données.

Scénario Descriptif
Rapports Les rapports offrent un moyen flexible d’afficher et de résumer vos données dans un document imprimé. Il est courant de créer un rapport qui imprime le contenu sélectionné d’une source de données à l’écran ou à une imprimante. Les rapports courants incluent des listes, des factures et des résumés. Les éléments sont mis en forme en colonnes de listes, avec des sous-éléments organisés sous chaque élément de liste, mais vous devez choisir la disposition qui convient le mieux aux données.
Entrée de données Un moyen courant d’entrer de grandes quantités de données associées ou d’inviter les utilisateurs à entrer des informations via un formulaire d’entrée de données. Les utilisateurs peuvent entrer des informations ou sélectionner des choix à l’aide de zones de texte, de boutons d’option, de listes déroulantes et de cases à cocher. Les informations sont ensuite envoyées et stockées dans une base de données, dont la structure est basée sur les informations entrées.
Relation maître/détail Une application maître/détail est un format pour examiner les données associées. Plus précisément, il existe deux tables de données avec une relation qui se connecte dans l’exemple d’entreprise classique, une table « Customers » et une table « Orders » avec une relation entre elles liant les clients et leurs commandes respectives. Pour plus d’informations sur la création d’une application maître/détail avec deux contrôles Windows Forms, consultez DataGridView.
Table de choix Un autre scénario courant de présentation/manipulation des données est la recherche dans une table. Souvent, dans le cadre d’un affichage de données plus volumineux, un contrôle ComboBox est utilisé pour afficher et manipuler des données. La clé est que les données affichées dans le contrôle ComboBox sont différentes des données écrites dans la base de données. Par exemple, si vous avez un contrôle ComboBox affichant les articles disponibles à partir d’une épicerie, vous souhaitez probablement voir les noms des produits (pain, lait, œufs). Toutefois, pour faciliter la récupération des informations dans la base de données et pour la normalisation de la base de données, vous devez probablement stocker les informations pour les éléments spécifiques d’un ordre donné en tant que numéros d’élément (#501, #603, etc.). Par conséquent, il existe une connexion implicite entre le « nom familier » de l’article d'épicerie dans le ComboBox contrôle de votre formulaire et le numéro d’article associé qui figure dans une commande. C’est l’essence d’une recherche dans une table de données. Pour plus d’informations, consultez Comment créer une table de recherche avec le composant BindingSource de Windows Forms.

Voir aussi