Partager via


Implémentation d'un concepteur de contrôles dépendants Web Forms

La tâche principale d'un concepteur de contrôles dépendants consiste à autoriser un contrôle à accéder à une autre source de données au moment du design (exemple) lorsque le contrôle se trouve dans le concepteur. Le .NET Framework fournit une interface (IDataSourceProvider) qui spécifie le contrat permettant d'accéder à une source de données. Un concepteur d'un contrôle serveur dépendant doit implémenter l'interface IDataSourceProvider et les autres étapes clés décrites dans la procédure suivante.

Pour implémenter un concepteur de contrôles dépendants

Remarque   Les étapes ci-après décrivent l'implémentation spécifique de l'exemple de concepteur de contrôles dépendants basés sur un modèle Web Forms. Cette implémentation peut s'appliquer à un contrôle avec une source de données d'objet de type qui accepte une référence IEnumerable.

  1. Définit une classe qui dérive directement ou indirectement de ControlDesigner et implémente l'interface IDataSourceProvider, comme illustré dans le fragment de code suivant.

    Public Class DataboundControlDesigner
       Inherits ControlDesigner
       Implements IDataSourceProvider
       ...
    End Class
    [C#]
    public class DataboundControlDesigner : ControlDesigner, IDataSourceProvider {...}
    
  2. Expose une propriété (de type chaîne) nommée DataSource qui spécifie une source de données au moment du design. Pour obtenir un exemple de la façon d'implémenter cette propriété, consultez l'exemple de concepteur de contrôles dépendants basés sur un modèle Web Forms. La propriété DataSource du concepteur fonctionne en haut de la collection DataBindings du contrôle.

  3. Substituez la méthode GetDesignTimeHtml et affectez la source de données du contrôle (associé à votre concepteur) à la source de données au moment du design. Pour obtenir un exemple sur la façon de substituer cette méthode pour remplacer la source de données, consultez l'exemple de concepteur de contrôles dépendants basés sur un modèle Web Forms.

  4. Substituez la méthode PreFilterProperties pour remplacer (« shadow ») la propriété DataSource sur le contrôle par la propriété DataSource au moment du design. La méthode PreFilterProperties appartient à l'interface IDesignerFilter, qui permet à un concepteur de remplacer ou de créer des propriétés et des événements au moment du design. IDesignerFilter est implémenté par ControlDesigner. Pour plus d'informations sur le filtrage des propriétés, consultez Filtrage des métadonnées. Le fragment de code suivant montre un exemple de substitution de la méthode PreFilterProperties.

    Protected Overrides Sub PreFilterProperties(properties As IDictionary)
       MyBase.PreFilterProperties(properties)
    
       Dim prop As PropertyDescriptor
    
       prop = CType(properties("DataSource"), PropertyDescriptor)
       Debug.Assert(( Not (prop Is Nothing)))
       prop = TypeDescriptor.CreateProperty(Me.GetType(), prop, _
             New Attribute() {New TypeConverterAttribute(GetType(DataSourceConverter))})
    
       properties("DataSource") = prop
    End Sub
    [C#]
    protected override void PreFilterProperties(IDictionary properties) {
                base.PreFilterProperties(properties);
    
                PropertyDescriptor prop;
    
                prop = (PropertyDescriptor)properties["DataSource"];
                Debug.Assert(prop != null);
                prop = TypeDescriptor.CreateProperty(this.GetType(), prop,
                                                     new Attribute[] {
                                                         new TypeConverterAttribute(typeof(DataSourceConverter))
                                                     });
                properties["DataSource"] = prop;
            }
    
  5. Implémentez les méthodes de l'interface IDataSourceProvider. Cette interface comporte deux méthodes — GetResolvedSelectedDataSource et GetSelectedDataSource. L'exemple de code suivant illustre l'implémentation de ces méthodes dans exemple de concepteur de contrôles dépendants basés sur un modèle Web Forms.

       Function GetResolvedSelectedDataSource() As IEnumerable Implements IDataSourceProvider.GetResolvedSelectedDataSource
          Return CType(CType(Me, IDataSourceProvider).GetSelectedDataSource(), IEnumerable)
       End Function
    
       Function GetSelectedDataSource() As Object Implements IDataSourceProvider.GetSelectedDataSource
          Dim selectedDataSource As Object = Nothing
          Dim dataSource As String = Nothing
    
          Dim binding As DataBinding = DataBindings("DataSource")
          If Not (binding Is Nothing) Then
             dataSource = binding.Expression
          End If
    
          If Not (dataSource Is Nothing) Then
             Dim componentSite As ISite = Component.Site
             If Not (componentSite Is Nothing) Then
                Dim container As IContainer = CType(componentSite.GetService(GetType(IContainer)), IContainer)
    
                If Not (container Is Nothing) Then
                   Dim comp As IComponent = container.Components(dataSource)
                   If TypeOf comp Is IEnumerable Then
                      selectedDataSource = comp
                   End If
                End If
             End If
          End If
    
          Return selectedDataSource
       End Function
    [C#]
    IEnumerable IDataSourceProvider.GetResolvedSelectedDataSource() {
                return (IEnumerable)((IDataSourceProvider)this).GetSelectedDataSource();
            }
    
            object IDataSourceProvider.GetSelectedDataSource() {
                object selectedDataSource = null;
                string dataSource = null;
    
                DataBinding binding = DataBindings["DataSource"];
                if (binding != null) {
                    dataSource = binding.Expression;
                }
    
                if (dataSource != null) {
                    ISite componentSite = Component.Site;
                    if (componentSite != null) {
                        IContainer container = (IContainer)componentSite.GetService(typeof(IContainer));
    
                        if (container != null) {
                            IComponent comp = container.Components[dataSource];
                            if (comp is IEnumerable) {
                                selectedDataSource = comp;
                            }
                        }
                    }
                }
    
                return selectedDataSource;
            }
    

Pour obtenir un exemple exhaustif regroupant les étapes précédentes, consultez l'exemple de concepteur de contrôles dépendants basés sur un modèle Web Forms.

Voir aussi

Exemple de concepteur de contrôles dépendants basés sur un modèle Web Forms | Implémentation d'un éditeur de modèles Web Forms | Concepteurs personnalisés | Prise en charge des Web Forms au moment du design