it-swarm.it

Come trascino i file in un'applicazione?

Ho visto questo fatto in Borland Turbo C++ environment, ma non sono sicuro di come farlo per un'applicazione C # su cui sto lavorando. Ci sono buone pratiche o trucchi da tenere d'occhio?

225
Samuel Paul

Alcuni esempi di codice:

  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);
    }
  }
473
Hans Passant

Siate consapevoli dei diritti di sicurezza di Windows Vista/Windows 7: se state eseguendo Visual Studio come amministratore, non sarete in grado di trascinare i file da una finestra Explorer non amministratore nel vostro programma quando lo eseguite da Visual Studio. Gli eventi relativi al trascinamento non spareranno nemmeno! Spero che questo aiuti qualcun altro là fuori non sprecare ore della loro vita ...

127
Wayne Uroda

In Windows Forms, imposta la proprietà AllowDrop del controllo, quindi ascolta gli eventi DragEnter e DragDrop.

Quando viene generato l'evento DragEnter, imposta AllowedEffect dell'argomento su un valore diverso da none (ad esempio e.Effect = DragDropEffects.Move).

Quando si attiva l'evento DragDrop, otterrai un elenco di stringhe. Ogni stringa rappresenta il percorso completo del file che viene eliminato.

40

Devi essere consapevole di un trucco. Qualsiasi classe passata come DataObject nell'operazione di trascinamento/rilascio deve essere serializzabile. Quindi, se provi a passare un oggetto e non funziona, assicurati che possa essere serializzato in quanto è quasi certamente il problema. Questo mi ha sorpreso un paio di volte!

16
Phil Wright

Ancora un altro pasticcio:

Il codice framework che chiama Drag-Events ingoia tutte le eccezioni. Potresti pensare che il tuo codice evento stia procedendo senza intoppi, mentre si stanno scatenando eccezioni ovunque. Non puoi vederli perché il framework li ruba.

Questo è il motivo per cui provo sempre a catturare questi gestori di eventi, quindi so se generano eccezioni. Di solito metto un Debugger.Break (); nella parte catch.

Prima del rilascio, dopo il test, se tutto sembra funzionare, rimuoverò o sostituirò questi con una gestione delle eccezioni reale.

10
Guge

Ecco qualcosa che ho usato per rilasciare file e/o cartelle piene di file. Nel mio caso stavo filtrando solo per i file *.dwg e ho scelto di includere tutte le sottocartelle.

fileList è un IEnumerable o simile Nel mio caso era associato a un controllo WPF ... 

var fileList = (IList)FileList.ItemsSource;

Vedi https://stackoverflow.com/a/19954958/492 per i dettagli di quel trucco.

Il gestore di interruzioni ...

  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);
    }
  }
7
CAD bloke

Un altro trucco comune è pensare di poter ignorare gli eventi Form DragOver (o DragEnter). Generalmente utilizzo l'evento DragOver di Form per impostare AllowEffect e quindi l'evento DragDrop di un controllo specifico per gestire i dati rilasciati.

6
Craig Eddy

La soluzione di Judah Himango e Hans Passant è disponibile nel Designer (attualmente sto utilizzando VS2015): enter image description here enter image description here

0
Roland