¿Cómo arrastro y suelto archivos en una aplicación?

Resuelto asked hace 16 años • 0 respuestas

He visto esto hecho en el entorno Turbo C++ de Borland , pero no estoy seguro de cómo hacerlo para una aplicación C# en la que estoy trabajando. ¿Existen mejores prácticas o trampas a tener en cuenta?

 avatar Sep 16 '08 08:09
Aceptado

Algún código de muestra:

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

    void Form1_DragEnter(object sender, DragEventArgs e) {
      if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
    }

    void Form1_DragDrop(object sender, DragEventArgs e) {
      string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
      foreach (string file in files) Console.WriteLine(file);
    }
  }
Hans Passant avatar Sep 18 '2008 02:09 Hans Passant

Tenga en cuenta los derechos de seguridad de Windows Vista/Windows 7: si ejecuta Visual Studio como administrador, no podrá arrastrar archivos desde una ventana del explorador que no sea de administrador a su programa cuando lo ejecute desde Visual Studio. ¡Los eventos relacionados con el arrastre ni siquiera se activarán!

Wayne Uroda avatar Jan 25 '2011 04:01 Wayne Uroda

En Windows Forms, establezca la propiedad AllowDrop del control y luego escuche el evento DragEnter y el evento DragDrop.

Cuando DragEnterse activa el evento, establezca los argumentos AllowedEffecten algo distinto de ninguno (por ejemplo, e.Effect = DragDropEffects.Move).

Cuando DragDropse active el evento, obtendrá una lista de cadenas. Cada cadena es la ruta completa al archivo que se elimina.

Judah Gabriel Himango avatar Sep 16 '2008 01:09 Judah Gabriel Himango

Debes estar consciente de un problema. Cualquier clase que pase como DataObject en la operación de arrastrar y soltar debe ser serializable. Entonces, si intenta pasar un objeto y no funciona, asegúrese de que se pueda serializar, ya que es casi seguro que ese sea el problema. ¡Esto me ha pillado un par de veces!

Phil Wright avatar Sep 16 '2008 02:09 Phil Wright

Otro problema más:

El código marco que llama a los eventos de arrastre se traga todas las excepciones. Podría pensar que su código de evento se está ejecutando sin problemas, mientras que genera excepciones por todas partes. No puedes verlos porque el framework los roba.

Es por eso que siempre pongo try/catch en estos controladores de eventos, para saber si arrojan alguna excepción. Normalmente pongo un Debugger.Break(); en la parte de captura.

Antes del lanzamiento, después de las pruebas, si todo parece funcionar, los elimino o los reemplazo con un manejo de excepciones real.

Guge avatar Nov 18 '2008 21:11 Guge