J'ai vu cela dans l' environnement Turbo C ++ de Borland , mais je ne sais pas comment procéder pour une application C # sur laquelle je travaille. Y a-t-il des bonnes pratiques ou des pièges à rechercher?
c#
winforms
drag-and-drop
Uwe Keim
la source
la source
Réponses:
Quelques exemples de code:
la source
io.File
(string[])
plâtre est-il sûr pour touteFileDrop
goutte formatée? Autrement dit, est-il possible de générer unFileDrop
qui provoquera une exception de conversion illégalestring[]
? J'ai du mal à comprendre cela à partir des documents .Soyez conscient des droits de sécurité de Windows Vista / Windows 7 - si vous exécutez Visual Studio en tant qu'administrateur, vous ne pourrez pas faire glisser des fichiers d'une fenêtre d'explorateur non administrateur vers votre programme lorsque vous l'exécuterez à partir de Visual Studio. Les événements liés à la traînée ne se déclencheront même pas! J'espère que cela aide quelqu'un d'autre à ne pas perdre des heures de sa vie ...
la source
Dans Windows Forms, définissez la propriété AllowDrop du contrôle, puis écoutez l'événement DragEnter et l'événement DragDrop.
Lorsque l'
DragEnter
événement se déclenche, définissez l'argumentAllowedEffect
sur autre chose que rien (par exemplee.Effect = DragDropEffects.Move
).Lorsque l'
DragDrop
événement se déclenche, vous obtenez une liste de chaînes. Chaque chaîne est le chemin d'accès complet au fichier en cours de suppression.la source
Vous devez être conscient d'un gotcha. Toute classe que vous transmettez en tant que DataObject dans l'opération de glisser / déposer doit être sérialisable. Donc, si vous essayez de passer un objet et qu'il ne fonctionne pas, assurez-vous qu'il peut être sérialisé car c'est presque certainement le problème. Cela m'a attrapé plusieurs fois!
la source
Encore un autre piège:
Le code d'infrastructure qui appelle les événements Drag engloutit toutes les exceptions. Vous pourriez penser que votre code d'événement fonctionne correctement, alors qu'il émet des exceptions partout. Vous ne pouvez pas les voir parce que le cadre les vole.
C'est pourquoi je mets toujours un try / catch dans ces gestionnaires d'événements, juste pour que je sache s'ils lèvent des exceptions. Je mets généralement un Debugger.Break (); dans la partie de capture.
Avant la sortie, après les tests, si tout semble se comporter, je les supprime ou les remplace par une véritable gestion des exceptions.
la source
Un autre problème courant consiste à penser que vous pouvez ignorer les événements Form DragOver (ou DragEnter). J'utilise généralement l'événement DragOver du formulaire pour définir le AllowEffect, puis l'événement DragDrop d'un contrôle spécifique pour gérer les données supprimées.
la source
Voici quelque chose que j'ai utilisé pour déposer des fichiers et / ou des dossiers pleins de fichiers. Dans mon cas, je filtrais
*.dwg
uniquement les fichiers et j'ai choisi d'inclure tous les sous-dossiers.fileList
est unIEnumerable
ou similaire Dans mon cas était lié à un contrôle WPF ...Voir https://stackoverflow.com/a/19954958/492 pour plus de détails sur cette astuce.
Le gestionnaire de dépôt ...
la source
La solution de Judah Himango et Hans Passant est disponible dans le Designer (j'utilise actuellement VS2015):
la source
Vous pouvez implémenter Drag & Drop dans WinForms et WPF.
Vous devez ajouter l'événement mousemove:
Vous devez ajouter un événement DragDrop:
void privé YourElementControl_DragDrop (expéditeur d'objet, DragEventArgs e)
Source avec code complet .
la source