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 ?
Réponses
Trop de publicités?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);
}
}
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...
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é.
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 !
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.
- Réponses précédentes
- Plus de réponses