Dosyaları bir uygulamaya nasıl sürükleyip bırakabilirim?


251

Bunun Borland'ın Turbo C ++ ortamında yapıldığını gördüm , ancak üzerinde çalıştığım bir C # uygulaması için nasıl devam edeceğimi bilmiyorum. Dikkat edilmesi gereken en iyi uygulamalar veya gotcha'lar var mı?


C # Uygulamasında veya C # IDE'ye sürükleyip bırakmak mı demek istediniz?
JamesSugrue

4
Cource, C # Uygulaması. Uygulamasını sürükle ve bırak dostu yapmak istiyor.
SLA80

3
En fazla yararlı cevaplar bağlantısını .
Venkatesh Kumar

Yanıtlar:


505

Bazı örnek kodlar:

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

56
Yasal Uyarı: Visual Studio'yu Windows 7'de yönetici olarak çalıştırırsanız veya programınızı yönetici olarak çalıştırırsanız hata ayıklamada çalışmayabilir. Buraya
Matthieu

Dosyaların içeriğini nasıl elde edersiniz?
Burnsys

3
@ Sürükleme işleminden dosyayoluna sahipseniz döndürürseniz, kullanarak okuyabilirsinizio.File
Smith

1
Ah, hayır. Tasarımcıda AllowDrop özelliğini True olarak ayarlayın ve oradan çıkarın.
Hans Passant

2
(string[])herhangi dökme güvenli FileDrop-dosyaları biçimlendirilmiş damla? Yani, FileDropyasadışı bir oyuncu istisnasına neden olacak bir tane oluşturmak mümkün string[]mü? Bunu dokümanlardan anlamakta zorlanıyorum .
kdbanman

140

Windows Vista / Windows 7 güvenlik haklarına dikkat edin - Visual Studio'yu yönetici olarak çalıştırıyorsanız, Visual Studio içinden çalıştırdığınızda dosyaları yönetici olmayan bir gezgin penceresinden programınıza sürükleyemezsiniz. Sürükle ile ilgili olaylar bile ateş etmeyecek! Umarım bu, başka birisinin hayatlarının saatlerini boşa harcamamasına yardımcı olur ...


6
@Wayne Uroda: Kodumun işe yaramadığını düşündüm - heck bana böyle büyük bir "Sembol yok" veriyordu en.wikipedia.org/wiki/File:ProhibitionSign2.svg . Sonra bu cevabı gördüm ve VS olmayan bir yönetici olarak çalıştı ve presto çalışır! Milyonlarca kez teşekkürler.
Derek W

Bunun için yeterince teşekkür edemem, bu gönderiyi bulamadığım sürece vazgeçerdim! 2017'de Windows 10'da yazdığınız zaman geçerli.
Culme

42

Windows Forms'da denetimin AllowDrop özelliğini ayarlayın, ardından DragEnter olayını ve DragDrop olayını dinleyin.

Ne zaman DragEnterolay patlar set argüman var AllowedEffecthiçbiri (örneğin dışında bir e.Effect = DragDropEffects.Move).

DragDropEtkinlik başladığında dizelerin bir listesini alırsınız. Her dize, bırakılan dosyanın tam yoludur.


16

Bir gotcha'nın farkında olmanız gerekir. Sürükle / bırak işleminde DataObject olarak ilettiğiniz herhangi bir sınıfın Serializable olması gerekir. Bu nedenle, bir nesneyi geçmeye çalışırsanız ve çalışmazsa, bunun kesinlikle sorun olduğu için serileştirilebildiğinden emin olun. Bu beni birkaç kez yakaladı!


14

Yine başka bir yakaladım:

Drag olaylarını çağıran çerçeve kodu tüm istisnaları yutar. Etkinlik kodunuzun her yerde istisnalar yaparken sorunsuz çalıştığını düşünebilirsiniz. Onları göremezsiniz çünkü çerçeve onları çalar.

Bu yüzden bu olay işleyicilerine her zaman bir deneme / yakalama koydum, sadece herhangi bir istisna atıp atmadıklarını biliyorum. Genellikle bir Debugger.Break (); yakalama kısmında.

Serbest bırakmadan önce, testten sonra, her şey davranıyor gibi görünüyorsa, bunları gerçek istisna işleme ile kaldırırım veya değiştiririm.


9

Bir diğer yaygın sorcha, Form DragOver (veya DragEnter) olaylarını göz ardı edebileceğinizi düşünüyor. Genellikle Form'un DragOver olayını AllowEffect ayarlamak ve sonra belirli bir denetimin DragDrop olay bırakılan verileri işlemek için kullanın.


7

İşte dosya ve / veya dosya dolu klasörleri bırakmak için kullandığım bir şey. Benim durumumda *.dwgsadece dosyaları filtreliyordum ve tüm alt klasörleri dahil etmeyi seçtim.

fileListBir olan IEnumerableya da benim durumda benzer bir WPF denetime bağlı ...

var fileList = (IList)FileList.ItemsSource;

Bu hile ile ilgili ayrıntılar için bkz. Https://stackoverflow.com/a/19954958/492 .

Damla İşleyici ...

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

3

Judah Himango ve Hans Passant'ın çözümü Tasarımcı'da mevcuttur (şu anda VS2015 kullanıyorum):

resim açıklamasını buraya girin

resim açıklamasını buraya girin


0

Sürükle ve Bırak özelliğini WinForms ve WPF'de uygulayabilirsiniz.

  • WinForm (Uygulama penceresinden sürükleyin)

Mousemove olayı eklemelisiniz:

private void YourElementControl_MouseMove(object sender, MouseEventArgs e)

    {
     ...
         if (e.Button == MouseButtons.Left)
         {
                 DoDragDrop(new DataObject(DataFormats.FileDrop, new string[] { PathToFirstFile,PathToTheNextOne }), DragDropEffects.Move);
         }
     ...
    }
  • WinForm (Uygulama penceresine sürükleyin)

DragDrop olayını eklemelisiniz:

private void YourElementControl_DragDrop (nesne gönderen, DragEventArgs e)

    {
       ...
       foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
            {
                File.Copy(path, DirPath + Path.GetFileName(path));
            }
       ...
    }

Tam kod ile kaynak .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.