DragAndDrop mit VB.Net
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.
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


December 13th, 2011 at 06:41
Super Sache, perfekt auf den Punkt gebracht.
Mit diesem Beispiel ist alles einfach und kompetent erklärt.
Danke für solche Beiträge…