it-swarm-eu.dev

Jak přetáhnu soubory do aplikace?

Viděl jsem to v prostředí Borland Turbo C++ prostředí, ale nejsem si jistý, jak to udělat pro aplikaci C #, na které pracuji. Existují osvědčené postupy nebo gotchas?

225
Samuel Paul

Ukázkový kód:

  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

Buďte si vědomi Windows Vista/Windows 7 bezpečnostních práv - pokud používáte Visual Studio jako administrátor, nebudete moci přetahovat soubory z okna, které není administrátorem, do vašeho programu, když ho spustíte z vizuálního studia. Události spojené s přetažením nebudou ani oheň! Doufám, že to pomůže někomu jinému, aby neztráceli hodiny svého života ...

127
Wayne Uroda

Ve formulářích systému Windows nastavte vlastnost AllowDrop ovládacího prvku a poté poslouchejte událost DragEnter a DragDrop.

Když událost DragEnter vyvolá, nastavte AllowedEffect argumentu na něco jiného než žádný (např. e.Effect = DragDropEffects.Move).

Když dojde k události DragDrop, zobrazí se seznam řetězců. Každý řetězec je úplná cesta k souboru, který je vynechán.

40

Musíte si být vědomi toho, co máme. Jakákoli třída, kterou předáváte jako DataObject v operaci drag/drop, musí být Serializable. Takže pokud se pokusíte předat objekt a nefunguje, zajistěte, aby mohl být serializován, což je téměř jistě problém. To mě několikrát zachytilo!

16
Phil Wright

Ještě jedna věc:

Kód rámce, který volá Drag-události, spolkne všechny výjimky. Možná si myslíte, že kód vaší akce běží hladce, zatímco všude se vyskytují výjimky. Nemůžete je vidět, protože je ukradne.

To je důvod, proč jsem v těchto handlerech vždycky zkusil/chytil, takže vím, jestli vyhodí nějaké výjimky. Obvykle jsem dal Debugger.Break (); v úlovku.

Před vydáním, po testování, když se zdá, že se vše chová, odstraním nebo nahradím tyto s opravdovou výjimkou.

10
Guge

Zde je něco, co jsem použil k upuštění souborů a/nebo složek plných souborů. V mém případě jsem filtroval pouze soubory *.dwg a rozhodl jsem se zahrnout všechny podsložky.

fileList je IEnumerable nebo podobné V mém případě bylo vázáno na ovládání WPF ... 

var fileList = (IList)FileList.ItemsSource;

Podrobnosti o tomto triku viz https://stackoverflow.com/a/19954958/492 .

Pokles 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

Další obyčejný gotcha je, že můžete ignorovat události Form DragOver (nebo DragEnter). Obvykle pomocí události DragOver formuláře nastavit EnableEffect a potom události DragDrop konkrétní ovládací prvek zpracovat vynechaných dat.

6
Craig Eddy

Řešení Judah Himango a Hans Passant je dostupné v Designeru (v současné době používám VS2015): enter image description here enter image description here

0
Roland