Compartir a través de


Implementar un diseñador de controles enlazados a datos de formularios Web Forms

La tarea principal de un diseñador de controles enlazados a datos es permitir que un control tenga acceso a un origen de datos en tiempo de diseño diferente (muestra) cuando el control está en el diseñador. .NET Framework proporciona una interfaz (IDataSourceProvider) que especifica el contrato que permite el acceso a un origen de datos. Un diseñador para un control de servidor enlazado a datos debe implementar la interfaz IDataSourceProvider y los otros pasos clave descritos en el procedimiento siguiente.

Para implementar un diseñador de controles enlazados a datos

Nota   En los siguientes pasos se describe la implementación específica del Ejemplo de diseñador de controles de formularios Web Forms enlazados a datos a partir de plantillas. Esta implementación puede aplicarse a un control que tenga un origen de datos de tipo objeto y que acepte una referencia IEnumerable.

  1. Defina una clase que se derive directa o indirectamente de ControlDesigner y que implemente la interfaz IDataSourceProvider, como se muestra en el siguiente fragmento de código.

    Public Class DataboundControlDesigner
       Inherits ControlDesigner
       Implements IDataSourceProvider
       ...
    End Class
    [C#]
    public class DataboundControlDesigner : ControlDesigner, IDataSourceProvider {...}
    
  2. Exponga una propiedad (de tipo cadena) denominada DataSource que especifique un origen de datos en tiempo de diseño. Para obtener un ejemplo de cómo implementar esta propiedad, vea Ejemplo de diseñador de controles de formularios Web Forms enlazados a datos basados en plantillas. La propiedad DataSource del diseñador funciona sobre la colección DataBindings del control.

  3. Reemplace el método GetDesignTimeHtml y establezca el origen de datos del control (que está asociado a su diseñador) como el origen de datos en tiempo de diseño. Para obtener un ejemplo de cómo reemplazar este método para reemplazar el origen de datos, vea Ejemplo de diseñador de controles de formularios Web Forms enlazados a datos basados en plantillas.

  4. Reemplace el método PreFilterProperties para reemplazar (o hacer prevalecer) la propiedad DataSource del control con la propiedad DataSource en tiempo de diseño. El método PreFilterProperties pertenece a la interfaz IDesignerFilter, que permite que un diseñador reemplace o cree propiedades y eventos en tiempo de diseño. ControlDesigner implementa IDesignerFilter. Para obtener más información acerca del filtrado de propiedades, vea Filtrado de metadatos. En el siguiente fragmento de código se muestra cómo puede reemplazar el método 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. Implemente los métodos de la interfaz IDataSourceProvider. Esta interfaz tiene dos métodos: GetResolvedSelectedDataSource y GetSelectedDataSource. En el siguiente ejemplo de código se muestra la implementación de estos métodos en el Ejemplo de diseñador de controles de formularios Web Forms enlazados a datos a partir de plantillas.

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

Para obtener un ejemplo completo que contiene los pasos anteriores, vea Ejemplo de diseñador de controles de formularios Web Forms enlazados a datos basados en plantillas.

Vea también

Ejemplo de diseñador de controles de formularios Web Forms enlazados a datos a partir de plantillas | Implementar un editor de plantillas de formularios Web Forms | Diseñadores personalizados | Compatibilidad en tiempo de diseño con formularios Web Forms