soltar ejemplo drop arrastrar archivos and c# winforms drag-and-drop

c# - ejemplo - arrastrar y soltar jquery



¿Cómo puedo arrastrar y soltar archivos en una aplicación? (8)

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


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); } }


Aquí hay algo que solía soltar archivos y / o carpetas llenas de archivos. En mi caso, estaba filtrando solo archivos *.dwg y elegí incluir todas las subcarpetas.

fileList es un IEnumerable o similar En mi caso estaba vinculado a un control WPF ...

var fileList = (IList)FileList.ItemsSource;

Consulte https://.com/a/19954958/492 para obtener detalles de ese truco.

El controlador de caída ...

private void FileList_OnDrop(object sender, DragEventArgs e) { var dropped = ((string[])e.Data.GetData(DataFormats.FileDrop)); var files = dropped.ToList(); if (!files.Any()) return; foreach (string drop in dropped) if (Directory.Exists(drop)) files.AddRange(Directory.GetFiles(drop, "*.dwg", SearchOption.AllDirectories)); foreach (string file in files) { if (!fileList.Contains(file) && file.ToLower().EndsWith(".dwg")) fileList.Add(file); } }


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

Cuando se dispara el evento AllowedEffect , establezca el efecto de efecto AllowedEffect del argumento en algo distinto a ninguno (por ejemplo, e.Effect = DragDropEffects.Move ).

Cuando el evento DragDrop se dispara, obtendrás una lista de cadenas. Cada cadena es la ruta completa al archivo que se está eliminando.


La solución de Judah Himango y Hans Passant está disponible en Designer (actualmente estoy usando VS2015):


Necesitas estar al tanto de un gotcha. Cualquier clase que pase como DataObject de DataObject en la operación de arrastrar y soltar tiene que ser serializable. Por lo tanto, si intenta pasar un objeto y no está funcionando, asegúrese de que pueda ser serializado, ya que es casi seguro que el problema. ¡Esto me ha atrapado un par de veces!


Otro problema común es pensar que se pueden ignorar los eventos Form DragOver (o DragEnter). Por lo general, uso el evento DragOver del formulario para establecer el AllowedEffect, y luego el evento DragDrop de un control específico para manejar los datos eliminados.


Sin embargo, otro gotcha:

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

Es por eso que siempre pongo un try / catch en estos manejadores de eventos, solo para saber si lanzan alguna excepción. Por lo general pongo un Debugger.Break (); en la parte de captura.

Antes del lanzamiento, después de la prueba, si todo parece comportarse, los elimino o sustituyo por el manejo de excepciones reales.


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 dispararán! Espero que esto ayude a alguien más por ahí que no pierda horas de su vida ...