durante esta clase se trabajo con la aplicacion de “imageBrowser” (la acabo de bautizar). Y basicamente lo que hicimos fue pasarla de su fase uno a la fase dos

El principal concepto desarrollado durante esta sesion es:

Eventos,    Eventos,         Eventos

  – delegate
Explicacion ejemplo: [situacion] llamas a un amigo por telefono a su casa pero no esta, dejas tu telefono para que cuando llegue te marque… mientras tu puedes seguir con tus actividades y no quedarte en la linea esperando (tal vez horas) hasta que llegue.  [analogia .net] le haces saber a un metodo (telefono de tu amigo) que vas a requerir que se te notifique (dejas tu telefono) cuando ocurra este cierto metodo (evento), mientras tu aplicacion puede seguir con sus operaciones…  

La situacion explicada puede concretarse debido a los delegates | delegados que podemos crear en punto NET.   Un delegado | delegate tiene las siguientes caracteristicas:   

  • verifican los tipos de parametros que se les pasan; o bien, verifican que el numero de telefono que dejas para que tu amigo llame este en el formato correcto.
  • se aseguran que siempre se apunte a un metodo existente; o bien, se asegura que el numero de telefono exista.
  • soportan “multicasting”; o bien, puedes dejar un listado de telefonos para que tu amigo haga notificaciones de que ya llego a todos ellos.

 Ahora bien, pasando esto a nuestra aplicacion, enfocandonos a nuestros usercontrols DriveList y FolderList, queremos que cuando el usuario seleccione una nueva unidad de disco, el listado de FolderList se actualice para mostrar las carpetas correctas.

Para esto necesitamos poner en nuestro DriveList, un evento para que otros objetos puedan “suscribirse” y ser notificados cuando el evento ocurra.

create event/deleg

en este codigo, podemos ver que se declara un delegado para validar metodos que no regresan resultado (void), y aceptan un parametro tipo string, este delegado se llamara SelectionChangedHandler.  En la siguiente linea se declara un evento llamado SelectionChanged y acepta subscripciones de metodos validados por el delegado SelectionChangedHandler.  Aparte se esta agregando la linea de codigo que “dispara” el evento desde nuestro control hacia los objetos interesados en reaccionar a dicho evento.  Esta linea esta dentro del metodo comboBox1_SelectedIndexChanged, el cual a su vez se corre cada vez que se selecciona un elemento diferente de nuestro ComboBox.

Cuando se corre SelectionChanged(comboBox1.Text), nuestro evento se esta disparando y se lleva con el el texto desplegado en el ComboBox para proporcionarselo a quien se haya suscrito al evento, y le interese ser notificado cada vez que se cambia de unidad de disco. 

 Vamos haciendo unas observaciones de lo que esta ocurriendo… busquemos en el codigo del control la llamada al metodo ComponentInitialize(), seleccionalo y dale click-derecho y “Goto Definition”; ahora busca por alli y veras la linea

this.comboBox1.SelectedIndexChanged +=
   
new System.EventHandler(this.comboBox1_SelectedIndexChanged);

esto suscribe el metodo comboBox1_SelectedIndexChanged al evento SelectedIndexChanged del objeto comboBox1, y aparte se esta validando que el metodo cumpla con las especificaciones del delegado EventHandler.  Ahora selecciona EventHandler y dale click-derecho y “Goto Definition”, veras la declaracion:

public delegate void EventHandler(object sender, EventArgs e);

Esto nos muestra que las especificaciones del delegado validan metodos que no regresan resultado (void) y requieren dos parametros, uno object, y otro EventArgs.  …volviendo a nuestra declaracion de delegado, nosotros validaremos que el metodo que se suscribe no regrese valor y acepte una cadena.

Nuestro control ya cuenta con el evento SelectionChanged.

Suscribiendome al evento del DriveList ;            Subscripcion

El siguiente paso sera suscribir un metodo al evento de tal manera que nuestro FolderList se actualice con la ruta correspondiente cada vez que se cambie de unidad de disco en DriveList

Necesitamos un metodo que cumpla con los requisitos de nuestro delegado SelectionChangedHandler: no regresa resultado, y acepte una cadena… Lo llamare CambioDrive. [, se validan estos requisitos ya que este tipo de delegado fue el que escogi para declarar el evento SelectionChanged]  En este metodo esta la logica para desplegar en FolderList la ruta que se selecciono en DriveList; recordemos que el evento trae consigo lo que obtuvo de comboBox1.Text al momento de ser disparado, y nos lo va a proporcionar con la variable string newDrive que tiene el metodo CambioDrive.

implement event

…ya que tenemos nuestro metodo que se apega a los requisitos de nuestro delegado, vamos suscribiendonos al evento.  Esto lo estoy poniendo en el Form1_Load:

link method to event

..de esta manera cada vez que el usuario cambia de unidad de disco, se dispara el evento SelectionChanged de driveList1, con esto, se notifica a los suscritos (CambioDrive) y por lo tanto, folderList1.DisplayFolders() con la ruta de driveList1. 😀