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.
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 {...}
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.
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.
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; }
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