Desarrollar controles de servidor Web enlazados a datos personalizados para ASP.NET 1.1

Actualización: noviembre 2007

Un control de servidor Web enlazado a datos de ASP.NET proporciona una interfaz de usuario (IU) para un origen de datos que representa una colección de registros o elementos. Los controles de servidor Información general sobre GridView (Control de servidor Web), Información general sobre DataList (Control de servidor Web) y Información general sobre Repeater (Control de servidor Web) son ejemplos de controles de servidor Web enlazados a datos. Para obtener más información sobre los controles enlazados a datos proporcionados con ASP.NET, vea Información general sobre los controles de servidor Web ASP.NET enlazados a datos.

Este tema presenta los pasos que se necesitan para implementar una versión mínima de un control de servidor enlazado a datos personalizado compatible con la versión 1.1 de ASP.NET. Para obtener más información sobre cómo crear controles enlazados a datos personalizados en la versión 2.0 de ASP.NET, vea Desarrollar controles de servidor web enlazados a datos personalizados para ASP.NET 2.0. Para obtener más información sobre la arquitectura y las implementaciones en general de los controles personalizados, vea Desarrollar controles de servidor ASP.NET personalizados y Tutorial: Desarrollar y utilizar un control de servidor personalizado.

Cuándo crear un control enlazado a datos personalizado

Antes de crear su propio control enlazado a datos personalizado, revise las funciones de los controles enlazados a datos que se proporcionan con ASP.NET. Los controles existentes podrían satisfacer sus necesidades, o podría optar por crear un control personalizado que amplíe un control existente que ya proporciona muchas de las características que necesita. Para obtener más información sobre los controles enlazados a datos proporcionados con ASP.NET, vea Información general sobre los controles de servidor Web ASP.NET enlazados a datos.

A continuación se citan algunos motivos por los que podría decidir crear un control enlazado a datos personalizado:

  • Sus necesidades concretas requieren una interfaz de usuario, características de ordenación de datos o características de edición de datos personalizadas que no están disponibles en los controles enlazados a datos existentes.

  • Desea crear un control enlazado a datos personalizado precompilado y redistribuible.

  • Desea ampliar las características de un control enlazado a datos proporcionado con ASP.NET.

  • Desea crear un control enlazado a datos con un diseñador personalizado que se ajuste a sus necesidades concretas.

Funcionalidad básica de un control enlazado a datos personalizado

Al efectuar una derivación de la clase Control o WebControl, el control enlazado a datos personalizado hereda automáticamente muchas funciones integradas, incluidas las siguientes:

  • Un modelo de enlace de datos explícito que admite expresiones de enlace de datos. El modelo de enlace de datos explícito de ASP.NET realiza el enlace de datos únicamente cuando se necesita, en lugar de en cada devolución de datos. Después de que una página lleva a cabo la primera solicitud de enlace de datos, las solicitudes subsiguientes intentan recuperar los datos del estado de vista. De este modo se mejora el rendimiento, al evitar la necesidad de volver a conectarse al origen de datos en cada solicitud.

  • Compatibilidad con expresiones de enlace de datos, que permite a los desarrolladores de páginas crear enlaces entre una propiedad expuesta del control marcada especialmente y un origen de datos. Para obtener más información sobre las expresiones de enlace de datos, vea Información general sobre las expresiones de enlace de datos.

Utilizar las características de tiempo de diseño disponibles

Hay características de tiempo de diseño disponibles para todos los controles de servidor Web que podrían ser adecuados para su uso con un control enlazado a datos personalizado. Puede crear una clase de diseñador y plantillas de control para el control personalizado. Se llama a estas características cuando se trabaja con el control en una superficie de diseño visual, como la vista Diseño de Visual Studio.

Crear un diseñador de controles puede aumentar en gran medida la facilidad de uso del control personalizado en tiempo de diseño, puesto que proporciona una interfaz de tiempo de diseño que permite a los programadores de páginas personalizar las propiedades de los controles. Para obtener información general sobre los diseñadores de controles ASP.NET, vea Información general sobre los diseñadores de controles ASP.NET. Para obtener ejemplos, vea HierarchicalDataBoundControlDesigner y Tutorial: Crear un diseñador de controles básico para un control de servidor Web.

Con la creación de un control con plantilla, proporciona a los programadores de páginas la flexibilidad necesaria para poder especificar los controles y el marcado que definen la interfaz de usuario del control. Para obtener un ejemplo de un control con plantilla personalizado, vea Ejemplo de control de servidor con plantilla.

Implementar un control enlazado a datos personalizado en ASP.NET

La tabla siguiente resume los requisitos específicos para la implementación de un control de servidor enlazado a datos en ASP.NET 1.1. Después de la tabla, encontrará más información detallada sobre cada uno de los requisitos de implementación.

Requisito

Descripción

Exponer una propiedad DataSource.

Permite a un programador de páginas que utiliza su control, especificar a qué origen de datos enlazar.

Reemplazar el método DataBind y crear la lógica que enumera el objeto en el origen de datos asociado.

En la lógica de este método:

  • Se llama al método OnDataBinding del control de servidor para generar el evento DataBind. Esto permite evaluar cualquier expresión de enlace de datos que el programador de páginas haya asociado al control de servidor enlazado a datos.

  • Aquí debe proporcionar toda la lógica necesaria para enumerar los objetos en el origen de datos.

  • Se crean todos los controles secundarios a fin de representar visualmente el origen de datos.

Crear una jerarquía de controles secundarios reemplazando el método CreateChildControls

Al devolver los datos, vuelve a crear los controles secundarios y los enlaza a los datos almacenados en el estado de vista durante una llamada anterior a DataBind.

Nota:

Estudie la conveniencia de crear un método auxiliar único al que llamarán los métodos DataBind y CreateChildControls para crear la jerarquía de controles secundarios. Por ejemplo, el método auxiliar que crea la jerarquía de controles secundarios podría aceptar un valor Boolean, que indica que los datos proceden del origen enlazado o del estado de vista. Este modelo mantiene la creación de la jerarquía de controles secundarios del control en una misma ruta de acceso de código. Para obtener un ejemplo de este modelo, vea Tutorial: Crear controles Web ASP.NET enlazados a datos personalizados para ASP.NET 1.1.

Exponer una propiedad DataSource

Un control enlazado a datos de ASP.NET 1.1 derivado de Control o WebControl debe exponer una propiedad DataSource para permitir al desarrollador de páginas seleccionar la recolección de datos a la que se enlazará su control de servidor. En tiempo de ejecución, su control enlazado a datos personalizado enumera la recolección de datos asignada a la propiedad DataSource a medida que crea y enlaza los elementos de la interfaz de usuario a fin de representar esos datos.

Un control de servidor enlazado a datos puede enlazarse a estos tipos:

En el ejemplo de código siguiente se muestra cómo exponer una propiedad DataSource de un control enlazado a datos. El tipo DataSource se declara como tipo 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();
        }
    }
}

Este ejemplo comienza con los atributos de metadatos, como [Category], [DefaultValue] y [Description], que proporcionan información utilizada por las herramientas de diseño, el analizador de páginas ASP.NET, el tiempo de ejecución de ASP.NET y Common Language Runtime (CLR). BindableAttribute notifica al diseñador visual que el explorador de propiedades puede mostrar las propiedades enlazables de un control en un cuadro de diálogo. (Por ejemplo, en Visual Studio, las propiedades enlazables se muestran en el cuadro de diálogo DataBindings.) CategoryAttribute especifica en qué categoría se debe situar la propiedad en el explorador de propiedades del diseñador visual. Para obtener más información sobre los atributos de metadatos, incluidos los utilizados en este ejemplo, vea Atributos de metadatos para controles de servidor personalizados.

El descriptor de acceso set de la propiedad DataSource comprueba que el valor que se va a establecer sea null o de tipo IEnumerable. Por consiguiente, en este ejemplo el desarrollador de páginas puede enlazar los datos a cualquier tipo IEnumerable, como Array, ArrayList o Hashtable. Como alternativa, el desarrollador puede establecer DataSource en null hasta que esté disponible un origen de datos apropiado de tipo IEnumerable.

Nota:

Si desea que el control de servidor enlazado a datos personalizado pueda enlazarse a un tipo de datos IEnumerable o IListSource, puede declarar la propiedad DataSource como el tipo genérico Object. En ese caso, el descriptor de acceso set que expone la propiedad DataSource deberá comprobar el tipo del objeto que se le ha pasado y, a continuación, implementará IEnumerable o IListSource.

Reemplazar el método DataBind y enumerar el origen de datos asociado

Se reemplaza el método base DataBind del control personalizado para permitir la realización de dos tareas: enumerar la recolección de datos enlazados y crear la jerarquía de controles secundarios que representará esos datos. La lista siguiente resume las tareas que debe realizar dentro del método DataBind reemplazado:

  • Llame al método base OnDataBinding del control personalizado.

  • Borre todos los controles secundarios existentes.

  • Borre todos los estados de vista de los controles secundarios.

  • Realice el seguimiento del estado para que los cambios que se lleven a cabo durante el enlace de datos se conserven en el estado de vista.

  • Cree la jerarquía de controles secundarios.

  • Establezca la propiedad ChildControlsCreated en true.

Comience por llamar al método base OnDataBinding del control desde el método DataBind reemplazado en el control. Llamar al método base OnDataBinding del control provoca la evaluación de todas las expresiones de enlace de datos del control. En el ejemplo de código siguiente se muestra cómo llamar al método OnDataBinding en un control de servidor enlazado a datos como la primera tarea dentro del método DataBind reemplazado.

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

A continuación, borre los controles secundarios existentes. Puesto que la jerarquía de controles secundarios se debe volver a crear con cada devolución de datos basada en los datos que se van a enlazar, es necesario borrar todos los controles secundarios existentes llamando al método heredado Clear del control, como se muestra en el ejemplo de código siguiente.

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

Se crearán controles secundarios nuevos para representar los datos recién enlazados, por lo que es necesario descartar todos los estados de vista de los controles secundarios existentes. Para borrar los estados de vista de todos los controles secundarios, llame al método heredado ClearChildViewState del control.

Después de haber borrado el estado de vista de todos los controles secundarios existentes, inicie el seguimiento del estado de vista del control llamando al método TrackViewState heredado del control, que se encarga de realizar el seguimiento del estado de vista. El seguimiento del estado del control se inicia antes de crear la jerarquía de controles secundarios para que todos los cambios que se realicen en dicha jerarquía durante el enlace de datos se conserven en el estado de vista. Puesto que un desarrollador de páginas puede llamar a DataBind durante el evento PreInit de la página, no puede confiar en la clase base del control para realizar el seguimiento del estado de vista que se produce después de esa fase del ciclo de vida de la página. En este caso, el seguimiento del estado de vista del control tendría lugar demasiado tarde en el proceso.

En el ejemplo de código siguiente se muestra un control de servidor enlazado a datos que llama a su método TrackViewState.

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

A continuación, cree la jerarquía de controles secundarios. La jerarquía de controles secundarios representa visualmente el origen de datos al que se enlaza el control enlazado a datos personalizado y se crea cuando la clase base del control llama a los métodos DataBind o CreateChildControls reemplazados del control personalizado. Cuando la clase base del control llama al método DataBind reemplazado del control, se crea la jerarquía de controles secundarios del control basándose en el origen de datos enlazado. Cuando la clase base llama al método CreateChildControls reemplazado del control, se crea la jerarquía de controles secundarios basándose en los datos guardados en el estado de vista.

La creación de la jerarquía de controles secundarios se desencadena cuando se llama al método DataBind del control. El control enumera los datos proporcionados por la propiedad expuesta DataSource y crea instancias de un nuevo control secundario para representar cada elemento de datos. Por ejemplo, si el origen de datos es una matriz de cadenas que se va a enlazar a la propiedad Text de los controles Button, recorra en iteración la matriz, con lo que se creará un nuevo control Button cuya propiedad Text esté asignada al elemento de datos iterado representado como una cadena.

Después de crear la jerarquía de controles secundarios, establezca la propiedad ChildControlsCreated en true para indicar que la clase base no debe llamar al método CreateChildControls.

En el ejemplo de código siguiente se muestra un control de servidor enlazado a datos que establece la propiedad ChildControlsCreated en true.

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

La clase del control enlazado a datos personalizado debe proporcionar un método CreateChildControls reemplazado donde el control vuelva a crear la jerarquía de controles secundarios y permita aplicar el estado de vista guardado. (El seguimiento del estado de vista guardado se efectúa durante la llamada más reciente al método DataBind del control.)

La lista siguiente resume las tareas que debe realizar en el método CreateChildControls reemplazado:

  • Borre todos los controles secundarios existentes.

  • Cree el jerarquía de controles secundarios, si está disponible el estado de vista.

Antes de volver a crear la jerarquía de controles secundarios, debe borrar todos los objetos de controles secundarios existentes. Para ello, se llama al método Clear del control.

En el ejemplo de código siguiente se muestra un control de servidor enlazado a datos que llama a su método Clear.

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

Por último, se crea la jerarquía de controles secundarios. El método CreateChildControls debe volver a crear la jerarquía de controles secundarios si existe un estado de vista disponible. Siempre que se cree la misma cantidad y los mismos tipos de controles secundarios en la misma jerarquía, el estado de vista guardado se aplicará automáticamente a los controles secundarios. El control puede guardar la información que necesita para volver a crear la misma cantidad, el mismo tipo y la misma jerarquía de controles secundarios en la propiedad ViewState del control. Para obtener más información sobre cómo guardar el estado de vista de un control, vea ViewState. Para obtener un ejemplo de código completo que muestra la creación de una jerarquía de controles secundarios en un control enlazado a datos personalizado, vea Tutorial: Crear controles Web ASP.NET enlazados a datos personalizados para ASP.NET 1.1.

Generar un control de servidor personalizado

Para obtener información sobre cómo generar un control de servidor Web enlazado a datos personalizado y utilizarlo en una página Web, vea Generar ejemplos de controles de servidor personalizados.

Nota:

Debe agregar una referencia al ensamblado System.Design para incluirlo en la compilación.

Vea también

Tareas

Tutorial: Crear controles Web ASP.NET enlazados a datos personalizados para ASP.NET 1.1

Tutorial: Desarrollar y utilizar un control de servidor personalizado

Conceptos

Información general sobre los controles de servidor Web ASP.NET enlazados a datos

Atributos de metadatos para controles de servidor personalizados

Información general sobre los diseñadores de controles ASP.NET

Referencia

HierarchicalDataBoundControlDesigner

Otros recursos

Desarrollar controles de servidor ASP.NET personalizados