283 votes

Comment faire glisser et déposer des fichiers dans une application C# ?

J'ai vu cela dans le logiciel Borland Turbo C++ 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 problèmes à éviter ?

549voto

Hans Passant Points 475940

Quelques exemples de code :

  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      this.AllowDrop = true;
      this.DragEnter += new DragEventHandler(Form1_DragEnter);
      this.DragDrop += new DragEventHandler(Form1_DragDrop);
    }

    void Form1_DragEnter(object sender, DragEventArgs e) {
      if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
    }

    void Form1_DragDrop(object sender, DragEventArgs e) {
      string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
      foreach (string file in files) Console.WriteLine(file);
    }
  }

160voto

Wayne Uroda Points 1650

Soyez conscient des droits de sécurité de Windows vista/Windows 7 - si vous exécutez Visual Studio en tant qu'administrateur, vous ne serez pas en mesure de glisser des fichiers d'une fenêtre d'explorateur non administrateur dans votre programme lorsque vous l'exécutez à partir de Visual Studio. Les événements liés au glisser ne se déclencheront même pas ! J'espère que cela aidera quelqu'un d'autre à ne pas perdre des heures de sa vie...

51voto

Judah Himango Points 27365

Dans Windows Forms, définissez la propriété AcceptDrop du contrôle, puis écoutez les événements DragEnter et DragDrop.

Lorsque le DragEnter se déclenche, définissez la valeur de l'argument AllowedEffect à quelque chose d'autre qu'aucun (par ex. e.Effect = DragDropEffects.Move ).

Lorsque le DragDrop se déclenche, vous obtiendrez une liste de chaînes de caractères. Chaque chaîne est le chemin complet du fichier déposé.

17voto

Phil Wright Points 11696

Vous devez être conscient d'un piège. Toute classe que vous passez comme DataObject dans l'opération de glisser/déposer doit être sérialisable. Donc si vous essayez de passer un objet, et que cela ne fonctionne pas, assurez-vous qu'il peut être sérialisé car c'est presque certainement le problème. Cela m'a pris plusieurs fois au dépourvu !

14voto

Guge Points 3761

Encore un autre gotcha :

Le code du framework qui appelle les Drag-events avale toutes les exceptions. Vous pouvez penser que votre code d'événement fonctionne sans problème, alors qu'il fait jaillir des exceptions partout. Vous ne pouvez pas les voir parce que le framework les vole.

C'est pourquoi je place toujours un try/catch dans ces gestionnaires d'événements, afin de savoir s'ils lèvent des exceptions. Je mets généralement un Debugger.Break() ; dans la partie catch.

Avant la sortie de la version, après les tests, si tout semble se comporter correctement, je supprime ou remplace ces éléments par une véritable gestion des exceptions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X