Bonjour a tous,
Dans mon appli j'ai une listview contenant des noms de fichiers. J'aimerais faire un drag&Drop d'un de ces fichiers vers le bureau de Windows... pensez vous que cela soit possible?
Bonjour a tous,
Dans mon appli j'ai une listview contenant des noms de fichiers. J'aimerais faire un drag&Drop d'un de ces fichiers vers le bureau de Windows... pensez vous que cela soit possible?
Oui c'est possible en utilisant DoDragDrop (du moins moi j'ai pas de bureau (la flemme de reactiver les icones) mais ça marche pour un dossier quelconque).
Tout ce qu'il te faut pour l'exemple, c'est une listBox nommée listBox1 qui contient une liste de noms de fichiers qui seront copiés vers l'explorateur (après tu pourra personnaliser)
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 private int indexOfItemUnderMouseToDrag; private int indexOfItemUnderMouseToDrop; private Rectangle dragBoxFromMouseDown; private Point screenOffset; private void listBox1_MouseDown(object sender, MouseEventArgs e) { // Get the index of the item the mouse is below. indexOfItemUnderMouseToDrag = listBox1.IndexFromPoint(e.X, e.Y); if (indexOfItemUnderMouseToDrag != ListBox.NoMatches) { // Remember the point where the mouse down occurred. The DragSize indicates // the size that the mouse can move before a drag event should be started. Size dragSize = SystemInformation.DragSize; // Create a rectangle using the DragSize, with the mouse position being // at the center of the rectangle. dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)), dragSize); } else // Reset the rectangle if the mouse is not over an item in the ListBox. dragBoxFromMouseDown = Rectangle.Empty; } private void listBox1_MouseUp(object sender, MouseEventArgs e) { // Reset the drag rectangle when the mouse button is raised. dragBoxFromMouseDown = Rectangle.Empty; } private void listBox1_MouseMove(object sender, MouseEventArgs e) { if ((e.Button & MouseButtons.Left) == MouseButtons.Left) { // If the mouse moves outside the rectangle, start the drag. if (dragBoxFromMouseDown != Rectangle.Empty && !dragBoxFromMouseDown.Contains(e.X, e.Y)) { // The screenOffset is used to account for any desktop bands // that may be at the top or left side of the screen when // determining when to cancel the drag drop operation. screenOffset = SystemInformation.WorkingArea.Location; // Proceed with the drag-and-drop, passing in the list item. DragDropEffects dropEffect = listBox1.DoDragDrop(new DataObject(DataFormats.FileDrop,new string[]{ listBox1.Items[indexOfItemUnderMouseToDrag] as string}), DragDropEffects.Copy); } } }
Pour un exemple (en anglais) d'application : voir ici
Bonjour,
Effectivement l'opération "graphique" de drag N drop marche vers le bureau. Mais comment pour réellement copier le fichier comme dans le cas d'une décompression d'un fichier d'une archive. L'application ne reçoit aucun message du bureau indiquant la destination et surtout j'ai un beau message d'erreur disant que le fichier source n'existe pas.
Pour résumé, je souhaite faire du drag n drop depuis une listeview contenant des fichiers compressés et lors du drop sur le bureau (ou ailleurs) les décompresser et les copier à leur destination...
Merci de vos réponses...
Il faut que tu crées une classe qui implémente l'interface IDataObject
Au moment où tu drop l'objet sur le bureau, ça va appeler la méthode GetData, dans laquelle tu vas générer un fichier temporaire (dans %TEMP% par exemple), et l'OS va le déplacer dans le dossier cible (le bureau en l'occurence)
Le problème, c'est que si la génération prend du temps, ça bloque l'application ET l'explorateur Windows
Pour bien faire, il faudrait connaître, dans l'appli, la destination finale du drag/drop, mais je n'ai pas trouvé de moyen simple pour le faire. Une solution serait de créer dans le GetData un petit fichier avec un nom spécifique, qui contient des infos sur le fichier à extraire, et de surveiller avec un FileSystemWatcher l'endroit où l'utilisateur le lâche... à partir de là, tu connais la destination, et tu peux écrire le fichier dans le dossier voulu, sans bloquer l'explorateur (et même sans bloquer l'appli si tu le fais dans un autre thread...). C'est un peu du bricolage, mais je vois pas d'autre solution![]()
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Partager