WebParts con ASP.NET 2.0 (II) – Comunicación entre controles

Introducción :. 

Para que exista comunicación tiene que haber al menos dos partes implicadas, como bien sabemos, debe de a ver un emisor y un receptor, hasta aquí estamos de acuerdo. En el caso de los controles, uno tiene que actuar como comunicador (provee de datos a otros controles, y otro(s) que actua(n) como receptor(es) de la información (es decir, son consumidores "Receptores"). Claro está que para entre ellos haya comunicación fluida es necesario que todos hablen el mismo idioma. Dicho idioma, en este tipo de comunicación entre controles será un interfaz, que todos los controles implicados deben conocer, y que el encargado de proveer los datos debe implementar.

Definiciendo un interfaz (Idioma) :. 

Para que pongamos en comunicación dos o más controles hay que definir un interfaz que se adapte a nuestras necesidades. Por ejemplo, si tenemos un control calendario y otro que muestre las noticias de un dia determinado, podemos hacer que cuando se cambie la fecha en el calendario se actualice el listado de noticias. Por tanto tendremos un proveedor de datos (control "Calendario"), un consumidor (Control "Noticias"), y un interfaz que nos permitirá enviar la fecha seleccionada desde el proveedor a los consumidores.

Codígo de la interfaz:

Interfaz

Como podeís ver es realmente simple, aunque nada nos impide desarrollar interfaces mucho más complejos para intercambiar listas de datos,  tipos complejos.

Proveedor de datos :.

Ya definido el interfaz tenemos que convertir nuestro control "Tutoriales_WUCCalendario" en un proveedor de datos. Para ello tenemos que implementar dicho interfaz. El código es bastante sencillo, simplemente se devuelve la fecha seleccionada en el calendario, o la fecha del día si no hay ninguna. (vease imagen)Implementación IDataFecha

Además, de alguna forma hay que pasar está información a los consumidores. Y esto se consigue implementado un método público que devolverá un objeto de tipo "IDataFecha". A este método tenemos que añadirle el atributo:

<ConnectionProvider("Fecha")>

De hecho es el atributo lo que hace que este método se el que se utilice para pransmitir los datos. El nombre del método es indiferente, en este ejemplo le he puesto "Fecha". Sin embargo el parámetro "Fecha" del atributo si que tiene importancia, ya que es lo que se mostrará en pantalla cuando vayamos a definir una conexión. Conviene, por tanto, que tenga un valor que describa el tipo de los datos a intercambiar (por ej.: "Lista de datos", "Fecha seleccionada", etc).

Por último, el método proveedor en sí (que en nuestro caso se llama "Provider") es bastante simple, ya que se limita a devolver un objeto que implementa el interfaz "Idatafecha". En este caso nos devolvemos a nosotros mismos (es decir, el control "Tutoriales_WUCCalendario" ) puesto que implementa dicho interfaz.

Consumidores de datos :.

Definidos el interfaz y el proveedor de datos. Sólo necesitamos establecer quiénes van a consumir dichos datos. En nuestro caso va a ser control "CWNoticiasDefault.ascx", al que haremos algunas modificaciones. En primer lugar tenemos que implementar un metodo consumidor, que recibirá como parámetro un objeto de cualquier tipo siempre que implemente el interfaz "IDataFecha". Dicho método, al igual que en el caso del proveedor, puede tener cualquier nombre ya que el atributo que determita qué método se usará la comunicación es:

<ConnectionConsumer("Fecha")>

En nuestro caso el método se llama "GetInterface". Si que es importante (aunque no obligatorio) que el nombre del proveedor y consumidor coincidan, ya que es el dato que nos permitirá establecer la comunicación entre ellos.

La implementación del método en sí es sencilla. Simplemente tomamos el objeto recibido como parámentro y guardamos el valor de su propiedad "Fecha" en una variable privada. Dicha variable la usaremos en el evento "OnPreRender" . Si es nula devolveremos las noticias del día actual. Sí no es nula usaremos la fecha contenida en la propiedad "Fecha" del interfaz para mostrar las noticias de ese día.

Conectado controles :.

Ya tenemos los tres elementos principales, Interfaz común, proveedor de datos y un consumidor. Ahora tenemos que hacer que hablen entre sí. Para ello tenemos que establecer una conexión entre ellos. Hay tres formas de hacerlo: en tiempo de diseño, en tiempo de ejecución, y en tiempo de ejecución mediante programación.

En tiempo de diseño las conexiones se definen mediante la propiedad "StaticConnection" del control "WebPartManager". Como podemos ver en la imagen, se definen con el editor de conexión.

En la imagen, podemos apreciar lo que habría que introducir en cada uno de los campos para establecer una comunicación entre el control "WUCalendario" y el control "CWNoticiasDefault".

En tiempo de ejecución  las conexiones se definen gracias al control "ConnectionZone". Basta con arrastrar dicho control dentro de la pagína para empezar a establecer comunicaciones entre controles. Al añadir este control nos apareceré un nuevo modo de página disponible, el modo "Connect". Por tanto, para poder establecer conexiones tendremos que activar dicho modo de página, para a continuación seleccionar la opción de menú "Conectar" del control que vaya a actuar.

Como vemos en está última imagen, el control ConnectionZone detecta los dos controles, y sabe quién es el proveedor y quienes son los consumidores, en este caso solo hay uno, el control de noticias. En la sección "Para" podemos seleccionar el control al que le pasaremos el valor de fecha. Seleccionamos "Sin titulo" que pertenece al control Noticias, y por último "Conectar" y VOILA!!! ya tenemos conectamos los dos controles.

Por último, siempre tenemos la posibilidad de establecer una comunicación en tiempo de ejecución mediante programación.

 

2 comentarios sobre “WebParts con ASP.NET 2.0 (II) – Comunicación entre controles”

  1. Paco, tienes alguna idea como crear una conexion dinamicamente? es decir, cada vez que carges un custom control (como consumidor de datos), ese custom control verifique que su proveedor de datos (preestablecido por codigo) este activo, y se agregue la conexion estatica, y cuando obviamente cierres tu custom control, esa conexion estatica se cierre?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *