it-swarm-eu.dev

Wie kann ich Dateien in eine Anwendung ziehen und ablegen?

Ich habe gesehen, wie dies in der Umgebung von Borland Turbo C++ gemacht wurde, aber ich bin mir nicht sicher, wie ich es für eine C # -Anwendung machen soll, an der ich gerade arbeite. Gibt es Best Practices oder Fallstricke, auf die Sie achten sollten?

225
Samuel Paul

Einige Beispielcodes:

  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

Beachten Sie die Windows Vista/Windows 7-Sicherheitsrechte. Wenn Sie Visual Studio als Administrator ausführen, können Sie keine Dateien aus einem Explorerfenster ohne Administratorrechte in Ihr Programm ziehen, wenn Sie es aus Visual Studio heraus ausführen. Die Drag-bezogenen Ereignisse werden nicht einmal feuern! Ich hoffe, dass dies jemand anderem hilft, keine Stunden seines Lebens zu verschwenden ...

127
Wayne Uroda

Legen Sie in Windows Forms die AllowDrop-Eigenschaft des Steuerelements fest, und überwachen Sie das DragEnter-Ereignis und das DragDrop-Ereignis.

Wenn das DragEnter-Ereignis ausgelöst wird, setzen Sie die AllowedEffect des Arguments auf einen anderen Wert als none (z. B. e.Effect = DragDropEffects.Move).

Wenn das Ereignis DragDrop ausgelöst wird, erhalten Sie eine Liste mit Zeichenfolgen. Jede Zeichenfolge ist der vollständige Pfad zur abgelegten Datei.

40

Sie müssen sich einer Gotcha bewusst sein. Jede Klasse, die Sie als DataObject in der Drag/Drop-Operation übergeben, muss serialisierbar sein. Wenn Sie also versuchen, ein Objekt zu übergeben, und es nicht funktioniert, stellen Sie sicher, dass es serialisiert werden kann, da dies höchstwahrscheinlich das Problem ist. Das hat mich ein paar Mal erwischt!

16
Phil Wright

Noch eine andere Gotcha:

Der Framework-Code, der die Drag-Events aufruft, schluckt alle Ausnahmen. Sie denken vielleicht, dass Ihr Event-Code reibungslos läuft, während es überall Ausnahmen gibt. Sie können sie nicht sehen, weil der Rahmen sie stiehlt.

Deshalb füge ich diesen Event-Handlern immer einen Try/Catch hinzu, nur damit ich weiß, ob sie irgendwelche Ausnahmen werfen. Ich setze normalerweise einen Debugger.Break (); im Fangteil.

Wenn sich vor dem Release, nach dem Testen, alles zu verhalten scheint, entferne ich diese oder ersetze sie durch echte Ausnahmebehandlung.

10
Guge

Hier ist etwas, was ich zum Ablegen von Dateien und/oder Ordnern mit Dateien verwendet habe. In meinem Fall habe ich nur nach *.dwg-Dateien gefiltert und mich entschieden, alle Unterordner einzuschließen.

fileList ist eine IEnumerable oder ähnlich In meinem Fall war an ein WPF-Steuerelement gebunden ... 

var fileList = (IList)FileList.ItemsSource;

Unter https://stackoverflow.com/a/19954958/492 finden Sie Einzelheiten zu diesem Trick.

Der Drop-Handler ...

  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

Eine andere verbreitete Angelegenheit ist, dass Sie die Form DragOver (oder DragEnter) -Ereignisse ignorieren können. Normalerweise verwende ich das DragOver-Ereignis des Formulars, um den AllowedEffect-Wert festzulegen, und dann das DragDrop-Ereignis eines bestimmten Steuerelements, um die abgelegten Daten zu verarbeiten.

6
Craig Eddy

Die Lösung von Judah Himango und Hans Passant ist im Designer verfügbar (derzeit verwende ich VS2015): enter image description here enter image description here

0
Roland