Drag & Drop von Dateien aus einer ListBox (Win Forms)



  • Hallo allerseits,

    ich habe in meiner Anwendung eine ListBox, welche die Pfäde zu Dateien enthält. Nun will ich, dass man per Drag&Drop ein Element (also eine Zeile) aus dieser ListBox mit der Maus auf den WinExplorer ziehen kann, und das Programm dann automatisch eine Routine aufruft, die diese Datei an den gewählten Speicherort kopiert.

    Ist das technisch machbar? Wenn ja, wie? Bei MSDN etc. habe ich nichts gefunden, ich hoffe, ihr könnt mir weiterhelfen.

    Viele Grüße



  • Welche Technische Machbarkeit sprichst du an? Die des Drag-Drop oder die es Kopieren?



  • Ich will wissen, ob es überhaupt geht, eine Datei (bzw. die Adresse einer Datei) aus einer WinForms-Anwendung in ein Verzeichnis per Drag&Drop zu kopieren.



  • Das geht recht einfach:

    string[] files = new string[1];
    files[0] = sFullPath; // <- dein ListBox-Eintrag (mitsamt Pfad)
    
    DoDragDrop(new DataObject(DataFormats.FileDrop, files), DragDropEffects.Copy);
    

    P.S. Den Rest erledigt dann Windows, also das Kopieren der Datei(en)...

    Du kannst also damit auch mehrere Dateien gleichzeitig kopieren (einfach das Array entsprechend vergrößern), falls du z.B. eine Multiselect-ListBox verwendest.



  • Hi,

    schon mal danke für Deine Antwort. Leider funktioniert es bei mir nicht so, wie ich mir es vorstelle: Ich habe diese Routine jetzt in den listBox_DragDrop Eventhandler gepackt, aber dieser wird, auch wenn ich ein Element der Liste mit der Maus ziehe, nicht ausgelöst.
    Kannst Du mir da weiterhelfen, wieso das nicht geht? Meine Methode sieht jetzt so aus:

    private void listBoxAll_DragDrop(object sender, DragEventArgs e)
    {
       string[] files = new string[listBoxAll.SelectedItems.Count];
       int i = 0;
       foreach(var item in listBoxAll.SelectedItems)
       {
          files[i] = m_SearchedFiles[listBoxAll.SelectedIndices[i]].Name;
          i++;
       }
       DoDragDrop(new DataObject(DataFormats.FileDrop, files), DragDropEffects.Copy);
    }
    


  • Pack dir die Methode in das MouseDown bzw. MouseMove-Ereignis der ListBox.
    Bei MouseMove noch evtl. auf linken Button testen, s.a. Beispiele unter http://msdn.microsoft.com/de-de/library/system.windows.forms.control.dodragdrop.aspx



  • Nix mit Mouseevents.

    Hast DU in der Listbox Dragdrop aktiviert?
    Hast Du Form1_DragEnter auch hinzugefügt?

    private void Form1_DragEnter(object sender, DragEventArgs e)
            {
                if (e.Data.GetDataPresent("FileGroupDescriptor", false) && e.Data.GetDataPresent("FileContents", false) || e.Data.GetDataPresent(DataFormats.FileDrop))
                    e.Effect = DragDropEffects.Copy; // Okay
                else
                    e.Effect = DragDropEffects.None; // Unknown data, ignore it
    
            }
    


  • Doch mit MouseEvents!

    DaRealHustler möchte ja aus seiner Anwendung heraus das Drag&Drop starten - nicht Drag&Drop entgegennehmen.



  • Super, danke jetzt funktioniert es.
    Lösung: Einfach den Code in das MouseDown-Event reinpacken, wie Th69 es gesagt hat.
    [cs]
    private void listBoxAll_MouseDown(object sender, MouseEventArgs e)
    {
    if (e.Button == MouseButtons.Left)
    {
    string[] files = new string[listBoxAll.SelectedItems.Count];
    int i = 0;
    foreach (var item in listBoxAll.SelectedItems)
    {
    files[i] = m_SearchedFiles[listBoxAll.SelectedIndices[i]].Name;
    i++;
    }
    DoDragDrop(new DataObject(DataFormats.FileDrop, files), DragDropEffects.Copy);
    }
    }

    VG



  • So, noch einmal in richtiger Form und diesmal mit Account 😉

    Super, danke jetzt funktioniert es.
    Lösung: Einfach den Code in das MouseDown-Event reinpacken, wie Th69 es gesagt hat.

    private void listBoxAll_MouseDown(object sender, MouseEventArgs e) 
    { 
       if (e.Button == MouseButtons.Left) 
       { 
          string[] files = new string[listBoxAll.SelectedItems.Count]; 
          int i = 0; 
          foreach (var item in listBoxAll.SelectedItems) 
          { 
             files[i] = m_SearchedFiles[listBoxAll.SelectedIndices[i]].Name; 
             i++; 
          } 
          DoDragDrop(new DataObject(DataFormats.FileDrop, files), DragDropEffects.Copy); 
       } 
    }
    

    VG


Log in to reply