Drag&Drop / Shell Windows

Drag&Drop / Shell Windows - C#/.NET managed - Programmation

Marsh Posté le 18-04-2007 à 11:18:36    

Bonjour,
 
Pour faire simple, je cherche a mettre en place un système de Drag&Drop à partir d'une ListView sur l'explorateur windows ou le bureau utilisateur.
 
Avant de me lancer dans le vide je vient prendre la température :p  
 
Avez-vous déja fait ? Sur quoi s'orienter ?
 
Merci d'avance

Reply

Marsh Posté le 18-04-2007 à 11:18:36   

Reply

Marsh Posté le 18-04-2007 à 11:28:10    

Bien entendu si je vient vers vous c'est que j'ai un peu regarder déja ...
 
et cela ne fonctionne pas par exemple:
 
 

Code :
  1. private void listViewFiles_ItemDrag(object sender, ItemDragEventArgs e)
  2. {
  3.  if (this.listViewFiles.SelectedItems.Count == 1)
  4.  {
  5.    DataObject dt = new DataObject(DataFormats.FileDrop, (string)this.listViewFiles.SelectedItems[0].Tag);
  6.    this.listViewFiles.DoDragDrop(dt, DragDropEffects.Copy);
  7.  }
  8. }


 
 


Message édité par Koyomi le 18-04-2007 à 11:29:09
Reply

Marsh Posté le 18-04-2007 à 11:49:02    

Ca veut dire quoi "ça ne fonctionne pas" ?
Qu'est ce que ça fait exactement ?
Il est comment le curseur quand tu fais ton drag sur l'explorateur ?

Reply

Marsh Posté le 18-04-2007 à 11:57:18    

Alors la copie ne s'éffectue pas.
 
Mon DataObject contient bien le path du fichier a copier :S
 
Le curseur est identique a un curseur normal avec en bas a droite un petit rectangle de type sélection et un petit + a coté.

Reply

Marsh Posté le 18-04-2007 à 13:24:53    

Bon pour les amateurs ... voici la solution :
 

Code :
  1. DataObject dataObj = null;
  2. private void listViewFiles_ItemDrag(object sender, ItemDragEventArgs e)
  3. {
  4. dataObj = new DataObject();
  5. String[] fileNames;
  6. //Create an array of strings to hold the filename(s)
  7. fileNames = new String[this.listViewFiles.SelectedItems.Count];
  8. //Create temporary files that the user can drag.
  9. for (int i = 0; i < this.listViewFiles.SelectedItems.Count; i++)
  10.  fileNames[i] = (string)this.listViewFiles.SelectedItems[i].Tag;
  11.  
  12. //Add the list of files to the data object
  13. dataObj.SetData(DataFormats.FileDrop, fileNames);
  14. //Set the preferred drop effect
  15. dataObj.SetData(ShellClipboardFormats.CFSTR_PREFERREDDROPEFFECT, DragDropEffects.Copy);
  16. //Indicate that we are in a drag loop
  17. dataObj.SetData(ShellClipboardFormats.CFSTR_INDRAGLOOP, 1);
  18. this.listViewFiles.DoDragDrop(dataObj, DragDropEffects.Copy);
  19. //Free the data object
  20. dataObj = null;
  21. }
  22.  
  23. private void listViewFiles_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
  24. {
  25. //ESC pressed
  26. if (e.EscapePressed)
  27. {
  28.  e.Action = DragAction.Cancel;
  29.  return;
  30. }
  31. //Drop!
  32. if (e.KeyState == 0)
  33. {
  34.  dataObj.SetData(ShellClipboardFormats.CFSTR_INDRAGLOOP, 0);
  35.  e.Action = DragAction.Drop;
  36.  return;
  37. }
  38. e.Action = DragAction.Continue;
  39. }


 

Code :
  1. public class ShellClipboardFormats
  2. {
  3. public const string CFSTR_SHELLIDLIST = "Shell IDList Array";
  4. public const string CFSTR_SHELLIDLISTOFFSET = "Shell Object Offsets";
  5. public const string CFSTR_NETRESOURCES = "Net Resource";
  6. public const string CFSTR_FILEDESCRIPTORA = "FileGroupDescriptor";
  7. public const string CFSTR_FILEDESCRIPTORW = "FileGroupDescriptorW";
  8. public const string CFSTR_FILECONTENTS = "FileContents";
  9. public const string CFSTR_FILENAMEA = "FileName";
  10. public const string CFSTR_FILENAMEW = "FileNameW";
  11. public const string CFSTR_PRINTERGROUP = "PrinterFreindlyName";
  12. public const string CFSTR_FILENAMEMAPA = "FileNameMap";
  13. public const string CFSTR_FILENAMEMAPW = "FileNameMapW";
  14. public const string CFSTR_SHELLURL = "UniformResourceLocator";
  15. public const string CFSTR_INETURLA = CFSTR_SHELLURL;
  16. public const string CFSTR_INETURLW = "UniformResourceLocatorW";
  17. public const string CFSTR_PREFERREDDROPEFFECT = "Preferred DropEffect";
  18. public const string CFSTR_PERFORMEDDROPEFFECT = "Performed DropEffect";
  19. public const string CFSTR_PASTESUCCEEDED = "Paste Succeeded";
  20. public const string CFSTR_INDRAGLOOP = "InShellDragLoop";
  21. public const string CFSTR_DRAGCONTEXT = "DragContext";
  22. public const string CFSTR_MOUNTEDVOLUME = "MountedVolume";
  23. public const string CFSTR_PERSISTEDDATAOBJECT = "PersistedDataObject";
  24. public const string CFSTR_TARGETCLSID = "TargetCLSID";
  25. public const string CFSTR_LOGICALPERFORMEDDROPEFFECT = "Logical Performed DropEffect";
  26. public const string CFSTR_AUTOPLAY_SHELLIDLISTS = "Autoplay Enumerated IDList Array";
  27. }


Message édité par Koyomi le 18-04-2007 à 13:25:38
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed