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