4 feb 2012

Drag and Drop

En una entrada anterior había construido una pequeña aplicación winform para listar los archivos de una carpeta. Luego de la misma se me ocurrió que seria muy útil poder arrastrar una carpeta a la aplicación y que esta automáticamente buscará en la misma los archivos a listar, o en otras palabras habilitar la característica de Drag and Drop.

Resultó increíblemente fácil, es cuestión de habilitar la característica y añadir un par de delegates para manejar los eventos asociados.

Primero, en el método del constructor de form habilitar el drag an drop y añadimos los dos delegates.

 public Form1()
 {
      InitializeComponent();
      this.AllowDrop = true;
      this.DragEnter += new DragEventHandler(Form1_DragEnter);
      this.DragDrop += new DragEventHandler(Form1_DragDrop);
 }

Ahora construimos las dos funciones que se añadieron en los delegates:
void Form1_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        e.Effect = DragDropEffects.Copy;
    }
    else
    {
        e.Effect = DragDropEffects.None;
    }
}

void Form1_DragDrop(object sender, DragEventArgs e)
{
    string[] filePaths = (string[])(e.Data.GetData(DataFormats.FileDrop));
    txtpath.Text =filePaths[0];
    Buscar();  //Metodo que busca en la carpeta que se arrastró
}

El primer método es el que se encarga de manejar el evento que se produce al entrar el arrastre de la carpeta en contacto con la form. En éste, si lo que se esta arrastrando es de tipo File, entonces se copia la información del mismo en los argumentos de la función . La segunda es la que maneja el evento correspondiente a "soltar" dentro de la form la carpeta que arrastramos. Cómo vemos en el código, sacamos la información de la carpeta la pasamos a la caja de texto que habíamos definido previamente (en el post mencionado) y ejecutamos la búsqueda.

Simple y sencillo. Habria que puliría más y manejar cosas como qué pasa cuando se arrastran más de una carpeta o lo que se arrastra es propiamente un archivo. Pero hasta aquí funciona a la perfección para mis propósitos.