viernes, 20 de noviembre de 2009

Aplicación Pomodoro en C# Mobile 6.5 – Delegados o como avisar a un formulario padre que ha ocurrido algo en un formulario hijo.

Enunciado:
  • Tengo un formulario A que llama a un formulario B.
  • Tengo una tabla de tareas en el formulario B y puedo añadir, modificar o borrar.
  • Tengo una lista desplegable de tareas en el formulario A y quiero que se actualice cuando en el formulario B modifique la tabla de tareas.

Para ello vamos a utilizar Delegados y Eventos que, de forma muy sencilla y muy potente, me permite una comunicación discreta -es decir sin necesidad de ser pública - entre ambos formularios.

Primero nos vamos al formulario B y declaramos el delegado: 

     public delegate void cambioEnListaDeTareasDelegate();

Despúes vamos a declarar el CallBack, es decir la variable que va a recibir la llamada del delegado en el formulario A.

     public cambioEnListaDeTareasDelegate cambioEnListaDeToDoCallback;

Despúes nos iremos al punto en donde decidamos que conviene situar el "aviso" de que hemos realizado un cambio en la tabla de tareas (seguimos en el formulario B). Por ejémplo en el método de guardarTarea();

      private void guardarTarea()
          {
                // Realizo las operaciones de guardar los datos.


                // Aquí lanzo la alerta al formulario A (o cualquier otro que este suscrito)

               cambioEnListaDeDatosCallback();
           }

Ya hemos acabado en el formulario B, consiguiendo que cada vez que se guarden los datos avise a todo aquel que esté suscrito que ha habido un cambio en la tabla de tareas.

Ahora nos vamos al formulario A y en el momento en que voy a abrir al formulario B le digo que, además, voy a hacer algo cada vez que en el formulario B se cambie la tabla de tareas.

¿Dónde le digo todo esto?, pues en este ejemplo en el evento click del botón de navegación que abre el formulario B. Pero podría ser en cualquier otro sitio siempre que hayamos instanciado el formulario B.

     private void bAdelante_Click(object sender, EventArgs e)
     {
            formularioB paginaSiguiente = new formularioB();
 
           // El truco del almendruco que enlaza la acción al evento.
           paginaSiguiente.cambioEnListaDeTareasCallback = new formularioB.cambioEnListaDeTareasDelegate(refrescaCombo);

            paginaSiguiente.ShowDialog();
     }

Como veís es una navegación entre formularios típica en WinForms, instanciando el formulario B y diciendole que lo muestre con show(). La diferencia, y el truco, es que llamamos a la campo de CallBack de la instancia del formulario B que queremos mostrar y le asignamos el delegado de la clase formularioB diciendole, además, entre paréntesis el qué quiere que haga. En este caso lanzar el método que refresca la lista despegable de tareas.

Finalmente he conseguido lo que quiero. Estoy en el formulario A, abro el formulario B y cambio la Tabla de tareas y automáticamente en el formulario A se me refresca la lista desplegable para actualizarla con los cambios realizados en el formulario B.

P.D. Es obvio que debes persistir de alguna forma la tabla de tareas para que ambos formularios utilicen el mismo juego de datos.

Fuente: C# corner: Muhammad Mosa - "Using delegates to communication between windows forms"
(No os preocupeis por la pantalla de identificación, se redirige automáticamente al artículo.)

No hay comentarios: