2009-06-17 7 views
10

J'ai une liste de fichiers avec leurs noms dans une listbox et leur contenu stocké dans une table SQL et je veux que l'utilisateur de mon application puisse sélectionner un ou plusieurs noms de fichiers dans la listbox et les faire glisser sur le bureau, donnant les fichiers réels sur le bureau. Je ne trouve aucune documentation sur la façon de procéder. Quelqu'un peut-il expliquer ou pointer vers une explication?Implémenter le glisser-déposer sur le bureau à partir d'une application .net winforms?

Ajouté plus tard: J'ai été capable de faire ce travail en gérant l'événement DragLeave. Dans ce document, je crée un fichier dans un répertoire temporaire avec le nom sélectionné et le contenu extrait de SQL Server. Je mets alors le chemin du fichier dans l'objet:

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

Mais cela semble très inefficace et maladroite, et je ne l'ai pas encore trouvé un bon moyen de se débarrasser des fichiers temporaires accumulés.

Répondre

10

Je peux vous aider un peu. Voici un code qui vous permettra de faire glisser quelque chose hors de la liste, et lorsqu'il sera déposé sur le bureau, il créera une copie d'un fichier existant sur votre machine sur le bureau.

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

Je comprends cela, mais ce que je ne comprends pas, c'est où foo.txt est créé et rempli avec son contenu de la table SQL. – mlo

+0

Est-il possible d'ajouter le "c: /foo.txt" mais lorsque le glisser est terminé, déposez le fichier avec un nouveau nom de fichier comme "new foo.txt"? – Nooneelse

3

est ici une partie de la plaque de la chaudière pour vous aider à déterminer quand commencer un glisser-opération:

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 
} 
Questions connexes