2009-06-17 11 views
10

Tengo una lista de archivos con sus nombres en un cuadro de lista y sus contenidos almacenados en una tabla SQL y quiero que el usuario de mi aplicación pueda seleccionar uno o más nombres de archivo en el cuadro de lista y arrastrarlos al escritorio, produciendo los archivos reales en el escritorio. No puedo encontrar ninguna documentación sobre cómo hacer esto. ¿Alguien puede explicar o señalar una explicación?¿Implementar el arrastre de archivos al escritorio desde una aplicación de .NET winforms?

Agregado después: He podido hacer que esto funcione manejando el evento DragLeave. En él creo un archivo en un directorio temporal con el nombre seleccionado y los contenidos extraídos de SQL Server. Entonces puse la ruta de acceso al archivo al objeto:

var files = new string[1]; 
files[0] = "full path to temporary file"; 
var dob = new DataObject();  
dob.SetData(DataFormats.FileDrop, files); 
DoDragDrop(dob, DragDropEffects.Copy); 

pero esto parece muy ineficiente y torpe, y todavía no he encontrado una buena manera de deshacerse de los archivos temporales acumulados.

Respuesta

10

Te puedo ayudar un poco. Aquí hay un código que le permitirá arrastrar algo fuera del cuadro de lista, y cuando se lo suelte en el escritorio, creará una copia de un archivo que existe en su equipo en el escritorio.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     this.listBox1.Items.Add("foo.txt"); 
     this.listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown); 
     this.listBox1.DragOver += new DragEventHandler(listBox1_DragOver); 
    } 

    void listBox1_DragOver(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Copy; 
    } 

    void listBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     string[] filesToDrag = 
     { 
      "c:/foo.txt" 
     }; 
     this.listBox1.DoDragDrop(new DataObject(DataFormats.FileDrop, filesToDrag), DragDropEffects.Copy); 
    } 
} 
+0

Entiendo esto, pero lo que no entiendo es dónde se crea foo.txt y se completa con su contenido de la tabla SQL. – mlo

+0

¿Es posible agregar "c: /foo.txt", pero cuando termine de arrastrar soltar el archivo con un nuevo nombre de archivo como "new foo.txt"? – Nooneelse

3

Aquí hay algunos de la placa de la caldera para ayudar a determinar cuándo comenzar un arrastrar operación:

private Rectangle _DragRect; 

private void MyDragSource_MouseDown(object sender, MouseEventArgs e) { 
    Size dragsize = SystemInformation.DragSize; 
    _DragRect = new Rectangle(new Point(e.X - (dragsize.Width/2), e.Y - (dragsize.Height/2)), dragsize); 
} 

private void MyDragSource_MouseMove(object sender, MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left) { 
     if (_DragRect != Rectangle.Empty && !_DragRect.Contains(e.X, e.Y)) { 
     // the mouse has moved outside of the drag-rectangle. Start drag operation 

     MyDragSource.DoDragDrop(.....) 
     } 
    } 
} 

private void MyDragSource_MouseUp(object sender, MouseEventArgs e) { 
    _DragRect = Rectangle.Empty; // reset 
} 
Cuestiones relacionadas