DragAndDrop mit VB.Net

January 5th, 2010 by | Print

Was passiert?

Drag&Drop Funktionalität wird an zwei Beispielen in folgendem kleinen Programm demonstriert. Es wird eine Windows Forms Anwendung mit drei Listboxen (ListBox1, ListBox2, ListBox3) benötigt.

ListBox1 enthält ein paar Einträge (Strings) die per Drag&Drop in die ListBox2 abgelegt werden können. ListBox3 demonstriert eine zweite Variante. Aus dem Windows-Explorer können Dateien in die ListBox3 gezogen werden.

dragdrop1

dragdrop1

dragdrop2

dragdrop2

Wie funktioniert’s?

Bei dieser Demo fungiert ListBox1 als Element aus dem Einträge gezogen werden können, ListBox2 ist Empfänger dieser Einträge. Die Eigenschaft AllowDrop von ListBox2 muss auf true gesetzt werden, damit Einträge fallen gelassen (drop) werden können. Mouse-Ereignisse steuern den Ablauf.

In Zeile 5 wird die Methode DoDragDrop aufgerufen. Der erste Parameter enthält den gezogenen Eintrag, also den gerade selektierten Namen (ListBox1.SelectedItem). Der zweite Parameter beschreibt über die Enumeration DragDropEffects, welche Aktion (in diesem Fall kopieren) ausgelöst werden soll.

Das Ereignis DragEnter tritt ein, wenn der Eintrag mit gedrückter Mouse-Taste über ListBox2 gezogen wird (Zeile 12). Es wird geprüft, ob der Eintrag dem Datenformat (Zeile 13) entspricht. Solange das nicht der Fall ist, wird der Eintrag nicht fallen gelassen und kein weiterer Event ausgelöst.

Andernfalls wird bei Loslassen der Mouse-Taste das DragOver-Ereignis ausgelöst und der selektierte Eintrag aus ListBox1 den Einträgen der ListBox2 hinzugefügt (Zeile 9).

ListBox3 zeigt Drag&Drop über das eigene Programm hinaus. Es kann z.B aus dem Windows-Explorer Dateien oder Ordner aufnehmen. Die Eigenschaft AllowDrop von ListBox3 muss auf true gesetzt werden, das Datenformat im DragEnter- (Zeile 30) und DragDrop-Ereignis (Zeile 24) muss angepasst werden.

Die gezogenen Dateien müssen als String-Array (Zeile 24) entgegen genommen werden, die Strings enthalten die absoluten Pfade zu den gezogenen Dateien. Bevor das Array der ListBox3 zugewiesen wird (Zeile 26), werden alle bisherigen Einträge der ListBox3 gelöscht (Zeile 25).

Quellcode:

Public Class Form1
 
    'der ausgewählte Eintrag wird angenommen (drag)
    Private Sub ListBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseDown
        ListBox1.DoDragDrop(ListBox1.SelectedItem.ToString(), DragDropEffects.Copy)
    End Sub
    'der ausgewählte Eintrag wird der Listbox hinzugefügt
    Private Sub ListBox2_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox2.DragDrop
        ListBox2.Items.Add(e.Data.GetData(DataFormats.Text))
    End Sub
    'der ausgewählte Eintrag wird abgelegt (drop)
    Private Sub ListBox2_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox2.DragEnter
        If (e.Data.GetDataPresent(DataFormats.Text)) Then
            e.Effect = DragDropEffects.Copy
        Else
            e.Effect = DragDropEffects.None
        End If
    End Sub
 
    'und ein Beispiel fuer Dateien
    Private Sub ListBox3_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox3.DragDrop
        Dim dateien() As String = e.Data.GetData(DataFormats.FileDrop)
        ListBox3.Items.Clear()
        ListBox3.Items.AddRange(dateien)
    End Sub
 
    Private Sub ListBox3_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox3.DragEnter
        If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then
            e.Effect = DragDropEffects.Copy
        Else
            e.Effect = DragDropEffects.None
        End If
    End Sub
 
End Class

ein Kommentar zu “DragAndDrop mit VB.Net”

  1. Robert Trojacek Says:

    Super Sache, perfekt auf den Punkt gebracht.
    Mit diesem Beispiel ist alles einfach und kompetent erklärt.
    Danke für solche Beiträge…

einen Kommentar abgeben