Partager via


Développement de contrôles serveur Web liés aux données personnalisés pour ASP.NET 1.1

Mise à jour : novembre 2007

Un contrôle serveur Web lié aux données ASP.NET fournit une interface utilisateur pour une source de données qui représente une collection d'enregistrements ou d'éléments. Les contrôles serveur Vue d'ensemble du contrôle serveur Web GridView, Vue d'ensemble du contrôle serveur Web DataList et Vue d'ensemble du contrôle serveur Web Repeater sont des exemples de contrôles serveur Web liés aux données. Pour plus d'informations sur les contrôles liés aux données fournis avec ASP.NET, consultez Vue d'ensemble des contrôles serveur Web liés aux données ASP.NET.

Cette rubrique présente les étapes requises pour implémenter une version minimale d'un contrôle serveur lié aux données compatible ASP.NET version 1.1 personnalisé. Pour plus d'informations sur la création de contrôles liés aux données personnalisés dans ASP.NET version 2.0, consultez Développement de contrôles serveur Web liés aux données personnalisés pour ASP.NET 2.0. Pour plus d'informations sur l'architecture générale et les implémentations de contrôles personnalisés, consultez Développement de contrôles serveur ASP.NET personnalisés et Procédure pas à pas : développement et utilisation d'un contrôle serveur personnalisé.

À quel moment créer un contrôle lié aux données personnalisé ?

Avant de créer votre propre contrôle lié aux données personnalisé, examinez les fonctions des contrôles liés aux données déjà fournis avec ASP.NET. Les contrôles existants peuvent satisfaire vos besoins ou vous pouvez décider de créer un contrôle personnalisé qui étend un contrôle existant présentant déjà la plupart des fonctionnalités dont vous avez besoin. Pour plus d'informations sur les contrôles liés aux données fournis avec ASP.NET, consultez Vue d'ensemble des contrôles serveur Web liés aux données ASP.NET.

Voici quelques raisons pour lesquelles vous pouvez décider de créer un contrôle lié aux données personnalisé :

  • Vos besoins particuliers nécessitent une interface utilisateur personnalisée, des fonctionnalités de tri des données personnalisées ou des fonctionnalités d'édition de données personnalisées qui ne sont pas disponibles dans les contrôles liés aux données existants.

  • Vous souhaitez créer un contrôle lié aux données personnalisé qui est précompilé et redistribuable.

  • Vous souhaitez étendre les fonctionnalités d'un contrôle lié aux données qui est déjà fourni avec ASP.NET.

  • Vous souhaitez créer un contrôle lié aux données avec un concepteur personnalisé qui s'adapte à vos besoins spécifiques.

Fonctionnalités de base d'un contrôle lié aux données personnalisé

En dérivant de la classe Control ou WebControl, votre contrôle lié aux données personnalisé hérite automatiquement de nombreuses fonctionnalités intégrées, parmi lesquelles :

  • Modèle de liaison de données explicite qui prend en charge des expressions de liaison de données. Le modèle de liaison de données explicite ASP.NET exécute la liaison de données uniquement lorsque nécessaire et non pour chaque publication. Une fois qu'une page a soumis la première demande de liaison de données, les demandes suivantes essaient de récupérer les données de l'état d'affichage. Les performances sont ainsi améliorées en évitant d'avoir à établir à nouveau la connexion à la source de données à chaque demande.

  • Prise en charge des expressions de liaison de données, ce qui permet aux développeurs de pages de créer des liaisons entre une propriété exposée et spécialement marquée de votre contrôle et une source de données. Pour plus d'informations sur les expressions de liaison de données, consultez Vue d'ensemble des expressions de liaison de données.

Utilisation des fonctionnalités de design disponibles

Il existe des fonctionnalités de design disponibles pour tous les contrôles serveur Web que vous pouvez envisager pour votre contrôle lié aux données personnalisé. Vous pouvez créer une classe de concepteur et des modèles de contrôle pour votre contrôle personnalisé. Ces fonctionnalités sont appelées lorsque vous utilisez le contrôle sur une aire de conception visuelle, par exemple le mode Design dans Visual Studio.

La création d'un Concepteur de contrôles peut augmenter considérablement la facilité d'utilisation de votre contrôle personnalisé au moment du design en fournissant une interface de design qui permet aux développeurs de pages de personnaliser les propriétés du contrôle. Pour obtenir une vue d'ensemble des Concepteurs de contrôles ASP.NET, consultez Vue d'ensemble des Concepteurs de contrôles ASP.NET. Pour obtenir des exemples, consultez HierarchicalDataBoundControlDesigner et Procédure pas à pas : création d'un Concepteur de contrôles de base pour un contrôle serveur Web.

En créant un contrôle basé sur un modèle, vous offrez aux développeurs de pages la souplesse pour spécifier les contrôles et le balisage qui définissent l'interface utilisateur du contrôle. Pour obtenir un exemple de contrôle basé sur un modèle personnalisé, consultez Contrôle serveur basé sur des modèles, exemple.

Implémentation d'un contrôle lié aux données personnalisé dans ASP.NET

Le tableau suivant résume les spécifications qui sont spécifiques à l'implémentation d'un contrôle serveur lié aux données dans ASP.NET 1.1. Des informations plus détaillées sur chacun des spécifications d'implémentation figurent à la suite du tableau.

Configuration requise

Description

Exposer une propriété DataSource.

Permet à un développeur de pages qui utilise votre contrôle de spécifier la source de données à laquelle établir une liaison.

Substituer la méthode DataBind et créer la logique pour énumérer l'objet dans la source de données associée.

Dans la logique de cette méthode :

  • La méthode OnDataBinding du contrôle serveur est appelée pour déclencher l'événement DataBind. Cela permet d'évaluer toute expression de liaison de données que le développeur de pages peut avoir associée au contrôle serveur lié aux données.

  • Vous devez fournir toute la logique pour énumérer les objets dans la source de données ici.

  • Tous les contrôles enfants sont créés pour représenter visuellement la source de données.

Créer une hiérarchie des contrôles enfants en substituant la méthode CreateChildControls.

Lors de la publication, recrée les contrôles enfants et les lie aux données stockées dans l'état d'affichage pendant un appel DataBind précédent.

Remarque :

Envisagez de créer une seule méthode d'assistance à appeler par les méthodes DataBind et CreateChildControls pour créer la hiérarchie des contrôles enfants. Par exemple, la méthode d'assistance qui crée la hiérarchie des contrôles enfants pourrait accepter une valeur Boolean, ce qui indique que les données proviennent de la source liée ou de l'état d'affichage. Ce modèle conserve la création de la hiérarchie des contrôles enfants du contrôle sur un chemin de code commun. Pour obtenir un exemple de ce modèle, consultez Procédure pas à pas : création d'un contrôle Web ASP.NET lié aux données personnalisé pour ASP.NET 1.1.

Exposition d'une propriété DataSource

Un contrôle lié aux données ASP.NET 1.1 dérivé de Control ou WebControl doit exposer une propriété DataSource pour permettre au développeur de pages de sélectionner la collection de données à laquelle votre contrôle serveur établira une liaison. Au moment de l'exécution, votre contrôle lié aux données personnalisé énumère la collecte de données assignée à la propriété DataSource à mesure qu'il crée et lie des éléments d'interface utilisateur pour représenter ces données.

Un contrôle serveur lié aux données peut créer une liaison avec les types suivants :

L'exemple de code suivant montre comment exposer une propriété DataSource pour un contrôle lié aux données. Le type DataSource est déclaré comme type IEnumerable.

<Category("Data"), DefaultValue(""), Description("An exposed data source: A public member of type IEnumerable to bind to such as an Array, ArrayList or Hashtable.")> _
Public Overridable Property DataSource() As IEnumerable
    Get
        Return _dataSource
    End Get
    Set(ByVal value As IEnumerable)
        If TypeOf value Is IEnumerable OrElse value Is Nothing Then
            _dataSource = value
        Else
            Throw New ArgumentException()
        End If
    End Set
End Property
[
Category("Data"),
DefaultValue(""),
Description("An exposed data source: A public member of type IEnumerable to bind to such as an Array, ArrayList or Hashtable.")
]
public virtual IEnumerable DataSource
{
    get
    {
        return _dataSource;
    }
    set
    {
        if ((value is IEnumerable) || (value == null))
        {
            _dataSource = value;
        }
        else
        {
            throw new ArgumentException();
        }
    }
}

Cet exemple commence par des attributs de métadonnées, tels que [Category], [DefaultValue] et [Description], qui fournissent les informations utilisées par les outils de conception, l'analyseur de pages ASP.NET, le runtime ASP.NET et le Common Language Runtime (CLR). L'BindableAttribute indique à un concepteur visuel que l'Explorateur de propriétés peut afficher les propriétés d'un contrôle qui peuvent être liées dans une boîte de dialogue. (Par exemple, dans Visual Studio, les propriétés pouvant être liées s'affichent dans la boîte de dialogue DataBindings). L'CategoryAttribute spécifie comment classer la propriété dans l'Explorateur de propriétés d'un concepteur visuel. Pour plus d'informations sur les attributs de métadonnées, y compris ceux utilisés dans cet exemple, consultez Attributs de métadonnées pour des contrôles serveur personnalisés.

L'accesseur set pour la propriété DataSource vérifie que la valeur à définir est null ou de type IEnumerable. Par conséquent, dans cet exemple, le développeur de pages peut lier des données à tout type IEnumerable, tel qu'un Array, ArrayList ou Hashtable. Le développeur peut également affecter la valeur null à la DataSource jusqu'à ce qu'une source de données appropriée de type IEnumerable soit disponible.

Remarque :

Si vous souhaitez que votre contrôle serveur lié aux données personnalisé soit capable de créer une liaison à un type de données IEnumerable ou IListSource, vous pouvez déclarer votre propriété DataSource comme Object de type générique. Dans ce cas, l'accesseur set qui expose votre propriété DataSource doit vérifier le type de l'objet qui lui est passé, puis implémenter IEnumerable ou IListSource.

Substitution de la méthode DataBind et énumération de la source de données associée

Vous fournissez une substitution à la méthode DataBind de base dans votre contrôle personnalisé pour activer l'exécution de deux tâches : énumérer la collection des données liées et créer la hiérarchie des contrôles enfants qui représentera ces données. La liste suivante résume les tâches que vous devez effectuer dans la méthode DataBind substituée :

  • Appelez la méthode OnDataBinding de base de votre contrôle personnalisé.

  • Effacez tous les contrôles enfants existants.

  • Effacez l'état d'affichage de tous les contrôles enfants.

  • Effectuez le suivi de l'état afin que les modifications apportées pendant la liaison de données soient conservées dans l'état d'affichage.

  • Créez la hiérarchie des contrôles enfants.

  • Affectez à la propriété ChildControlsCreated la valeur true.

Commencez en appelant la méthode OnDataBinding de base de votre contrôle à partir de la méthode DataBind substituée dans votre contrôle. L'appel de la méthode OnDataBinding de base de votre contrôle entraîne l'évaluation de toutes les expressions de liaison de données pour le contrôle. L'exemple de code suivant indique comment appeler la méthode OnDataBinding dans un contrôle serveur lié aux données en tant que première tâche dans sa méthode DataBind substituée.

public override void DataBind()
{
    base.OnDataBinding(EventArgs.Empty);
}
Public Overrides Sub DataBind()
    MyBase.OnDataBinding(EventArgs.Empty)
End Sub

Effacez ensuite les contrôles enfants existants. Dans la mesure où la hiérarchie des contrôles enfants doit être à nouveau créée avec chaque publication en fonction des données sur le point d'être liées, tous les contrôles enfants existants doivent être effacés en appelant la méthode Clear héritée du contrôle, comme illustré dans l'exemple de code suivant.

public override void DataBind()
{
    base.OnDataBinding(EventArgs.Empty);
    Controls.Clear();
}
Public Overrides Sub DataBind()
    MyBase.OnDataBinding(EventArgs.Empty)
    Controls.Clear()
End Sub

De nouveaux contrôles enfants étant créés pour représenter les données nouvellement liées, tout état d'affichage pour les contrôles enfants existants doit être ignoré. Vous effacez les états d'affichage de tous les contrôles enfants en appelant la méthode ClearChildViewState héritée du contrôle.

Après avoir effacé l'état d'affichage pour tous les contrôles enfants existants, démarrez le suivi de l'état d'affichage du contrôle en appelant la TrackViewState héritée du contrôle, qui effectue ce suivi à votre place. Le suivi de l'état du contrôle est démarré avant de créer la hiérarchie des contrôles enfants afin que toutes les modifications apportées à cette hiérarchie pendant la liaison de données soient conservées dans l'état d'affichage. Dans la mesure où un développeur de pages peut appeler DataBind pendant l'événement PreInit de la page, vous ne pouvez pas compter sur la classe de base de votre contrôle pour suivre l'état d'affichage qui se produit après cette étape dans le cycle de vie de la page. Dans ce cas, le suivi de l'état d'affichage pour le contrôle se produirait trop tard dans le processus.

L'exemple de code suivant illustre un contrôle serveur lié aux données qui appelle sa méthode TrackViewState.

public override void DataBind() 
{
    TrackViewState();
}
Public Overrides Sub DataBind()
    TrackViewState()
End Sub

Créez ensuite la hiérarchie des contrôles enfants. La hiérarchie des contrôles enfants représente visuellement la source de données à laquelle votre contrôle lié aux données personnalisé est lié, et est créée lorsque les méthodes DataBind or CreateChildControls substituées de votre contrôle personnalisé sont appelées par la classe de base de votre contrôle. Lorsque la DataBind substituée de votre contrôle est appelée par la classe de base du contrôle, la hiérarchie des enfants de votre contrôle est créée selon la source de données liée. Lorsque la méthode CreateChildControls substituée de votre contrôle est appelée par la classe de base, la hiérarchie des contrôles enfants est créée selon les données enregistrées dans l'état d'affichage.

La création de la hiérarchie des contrôles enfants est déclenchée par l'appel de la méthode DataBind du contrôle. Le contrôle énumère les données fournies par la propriété DataSource exposée et instancie un nouveau contrôle enfant pour représenter chaque élément de données. Par exemple, si la source de données est un tableau de chaînes à lier à la propriété Text de contrôles Button, parcourez le tableau, en créant un contrôle Button avec sa propriété Text assignée à l'élément de données itéré représenté sous forme de chaîne.

Après avoir créé la hiérarchie des contrôles enfants, affectez la valeur true à la propriété ChildControlsCreated pour indiquer que la méthode CreateChildControls ne doit pas être appelée par la classe de base.

L'exemple de code suivant illustre un contrôle serveur lié aux données affectant la valeur true à sa propriété ChildControlsCreated.

public override void DataBind()
{
     ChildControlsCreated = true;
} 
Public Overrides Sub DataBind()
    ChildControlsCreated = True
End Sub

La classe de votre contrôle lié aux données personnalisé doit fournir une méthode CreateChildControls substituée dans laquelle le contrôle recrée sa hiérarchie des contrôles enfants et autorise l'application de l'état d'affichage enregistré. (L'état d'affichage enregistré est suivi pendant l'appel le plus récent à la méthode DataBind du contrôle.)

La liste suivante résume les tâches que vous devez effectuer dans la méthode CreateChildControls substituée :

  • Effacez tous les contrôles enfants existants.

  • Créez la hiérarchie des contrôles enfants si l'état d'affichage est disponible.

Avant de recréer la hiérarchie des contrôles enfants, vous devez effacer tous les objets des contrôles enfants existants. Pour ce faire, appelez la méthode Clear du contrôle.

L'exemple de code suivant illustre un contrôle serveur lié aux données qui appelle sa méthode Clear.

public override void CreateChildControls()
{
    Controls.Clear();
}

En tant que dernière étape, vous créez la hiérarchie des contrôles enfants. La méthode CreateChildControls doit recréer la hiérarchie des contrôles enfants si l'état d'affichage est disponible. Tant que les mêmes nombre et types de contrôles enfants sont créés dans la même hiérarchie, l'état d'affichage enregistré est appliqué automatiquement aux contrôles enfants. Votre contrôle peut enregistrer les informations nécessaires pour recréer les mêmes nombre, type et hiérarchie de contrôles enfants dans la propriété ViewState de votre contrôle. Pour plus d'informations sur l'enregistrement de l'état d'affichage du contrôle, consultez ViewState. Pour obtenir un exemple de code complet qui illustre la création de la hiérarchie des contrôles enfants dans un contrôle lié aux données personnalisé, consultez Procédure pas à pas : création d'un contrôle Web ASP.NET lié aux données personnalisé pour ASP.NET 1.1.

Génération de votre contrôle serveur personnalisé

Pour plus d'informations sur la génération de votre contrôle serveur Web lié aux données personnalisé et son utilisation dans une page Web, consultez Exemples de création de contrôles serveur personnalisés.

Remarque :

Vous devez ajouter une référence à l'assembly System.Design pour l'inclure dans votre compilation.

Voir aussi

Tâches

Procédure pas à pas : création d'un contrôle Web ASP.NET lié aux données personnalisé pour ASP.NET 1.1

Procédure pas à pas : développement et utilisation d'un contrôle serveur personnalisé

Concepts

Vue d'ensemble des contrôles serveur Web liés aux données ASP.NET

Attributs de métadonnées pour des contrôles serveur personnalisés

Vue d'ensemble des Concepteurs de contrôles ASP.NET

Référence

HierarchicalDataBoundControlDesigner

Autres ressources

Développement de contrôles serveur ASP.NET personnalisés