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?
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?
Réponses:
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);
}
}
io.File
(string[])
plâtre est-il sûr pour toute FileDrop
goutte formatée? Autrement dit, est-il possible de générer un FileDrop
qui provoquera une exception de conversion illégale string[]
? 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 ...
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'argument AllowedEffect
sur autre chose que rien (par exemple e.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.
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!
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.
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.
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 un IEnumerable
ou similaire Dans mon cas était lié à un contrôle WPF ...
var fileList = (IList)FileList.ItemsSource;
Voir https://stackoverflow.com/a/19954958/492 pour plus de détails sur cette astuce.
Le gestionnaire de dépôt ...
private void FileList_OnDrop(object sender, DragEventArgs e)
{
var dropped = ((string[])e.Data.GetData(DataFormats.FileDrop));
var files = dropped.ToList();
if (!files.Any())
return;
foreach (string drop in dropped)
if (Directory.Exists(drop))
files.AddRange(Directory.GetFiles(drop, "*.dwg", SearchOption.AllDirectories));
foreach (string file in files)
{
if (!fileList.Contains(file) && file.ToLower().EndsWith(".dwg"))
fileList.Add(file);
}
}
Vous pouvez implémenter Drag & Drop dans WinForms et WPF.
Vous devez ajouter l'événement mousemove:
private void YourElementControl_MouseMove(object sender, MouseEventArgs e)
{
...
if (e.Button == MouseButtons.Left)
{
DoDragDrop(new DataObject(DataFormats.FileDrop, new string[] { PathToFirstFile,PathToTheNextOne }), DragDropEffects.Move);
}
...
}
Vous devez ajouter un événement DragDrop:
void privé YourElementControl_DragDrop (expéditeur d'objet, DragEventArgs e)
{
...
foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
{
File.Copy(path, DirPath + Path.GetFileName(path));
}
...
}