jueves, 22 de mayo de 2014

Comunicar Formularios

 

Introducción


Existen varias formas pasar información entre formularios, especialmente si queremos hacerlo sin generar una fuerte dependencia entre estos.

Este mismo tema lo había abordado en artículos anteriores por lo que retomaremos el análisis de las distintas formas de lograr la comunicación sin generar dependencia entre los forms

Los artículos anteriores en los cuales he tratado el tema:

Comunicar formularios de forma desacoplada

Comunicar formularios MDI

Para ejemplificar haremos uso de un form que permite listar y editar productos de la base de datos Northwind.

image

Analizaremos 3 formas de comunicar formularios y enviar datos entre ellos:

  • Usando Interfaces
  • Usando eventos
  • Usando el evento FormClosed

 

Usando interfaces


Una interfaz permite definir un contrato entre clases, permitiendo que una invoque la funcionalidad de cualquier otra que respete ese contrato definido.

Recordemos que los formularios en definitiva no son mas que clases que se instancian por lo que puede aplicarse los mismos conceptos de POO (Programación orientada a objetos).

La implementación de esta técnica se encuentra en la búsqueda de un proveedor en el form de edición de los productos.

image

El primer paso será definir la interfaz

image

siendo implementada por el formulario padre receptora de la información seleccionada por el usuario

SNAGHTML5a01d235

El form padre será quien instancie el form hijo pasando su instancia por parámetro en el constructor, además de algún otro valor adicional de ser necesario, como en este caso un filtro para limitar los ítems visualizados en el grid de selección.

 image

 

Desde el form hijo (frmFindSupplier) se define el constructor que recibirá los parámetro

SNAGHTML5a09bacf

La variable “caller” contendrá la instancia del form padre que implementa la interfaz, mientras que “_supplierName” tendrá el input del usuario para filtrar las entidades.

Al seleccionar un ítem del grid se dará por seleccionada la entidad y se enviara la acción al form padre a través de la instancia invocando el método definido en la interfaz.

image

Primero se valida que exista selección en el grid, se recupera la entidad seleccionada pasándola como parametro al método Selected() definido en la interfaz, por ultimo se cierra el formulario. El form padre recibe el valor seleccionado y actualiza los controles o entidades que hagan falta.

La secuencia completa quedaría de esta forma

SNAGHTML5b152bbf

  1. El form padre (frmEditProductos) implementa la interfaz.
  2. En el botón de búsqueda se crea la instancia del form hijo (frmFindSupplier), pasando como parámetro en el constructor la instancia del forma padre (utilizando this)
  3. El form hijo recibe en el constructor los valores por parámetro
  4. Se selecciona un ítem del grid y se invoca al método de la interfaz
  5. El form padre recibe la selección y actualiza los datos

Como ventaja se puede mencionar que cualquier form que implemente la interfaz podrá reutilizar la funcionalidad de búsqueda implementada al no quedar acoplados los formularios que interactuan.

 

Usando eventos


Permite enviar una acción directa al form que se subscriba al evento.

El ejemplo va a estar representado en la comunicación del form de edición de productos y la búsqueda de categorías.

image

Partamos analizando la implementación del form hijo (frmFindCategory), este expone el evento, que es lanzado cuando se selecciona una categoría del grid

SNAGHTML5a76cd3

Para definir datos específicos en el intercambio de información se crea una clase que hereda de EventArgs

image

 

Desde el form padre (frmEditProductos) simplemente se debe adjuntar al evento la instancia del form hijo

image

 

Repasemos como seria la ejecución en secuencia

SNAGHTML5c710fe

 

  1. El form hijo expone el evento, utilizado para informar la selección a quien lo haya invocado.
  2. Se define una clase que hereda de EventArgs para poder pasar información adicional como argumento del evento.
  3. El form padre que realiza la búsqueda crea la instancia del forma hijo y se adjunta al evento, además crea el método que recibirá la acción.
  4. Cuando se selecciona un ítem del grid se valida si alguien esta adjunto en el evento y se invoca.

 

Actualizar los datos al cerrar el form (evento FormClosed)


Para actualizar un grid luego de una acción en otro form podría utilizarse eventos existentes, como ser el FormClosed, con este evento se puede realizar una acción al cerrar un form

image

 

Analicemos los pasos

SNAGHTMLaeed38d

 

  1. En el form padre (frmAdminProducts) instancia el form hijo (frmEditProductos) y se adjunta el evento de cierre del form
  2. Cuando se presiona el boton de aceptar o cancelar se devuelve el DialogResult cerrando el form, esto lanza el evento FormClosed
  3. Desde el form padre se atrapa el evento y se realiza la recarga de los datos del grid

 

Descarga


El articulo fue desarrollando usando Visual Studio 2012, la base de datos es Sql Compact (.sdf)

Durante la compilación se descargaran las dependencias por medio de Nuget.


[C#]