Drag and Drop macht die Bedienung von Benutzeroberflächen sehr viel komfortabler. Dieser Artikel soll zeigen, was man alles tun muss, um Drag and Drop - Funktionaltäten zu implementieren.
Damit ein Control ein Drop akzeptiert, muss man die 'AllowDrop' - Eigenschaft des Controls auf true setzen.
Man startet einen Drag and Drop Vorgang mit der DoDragDrop-Methode, die jedes Control von Control erbt. Dieser Methode übergibt man den Inhalt des Drag and Drop Events und von welchem Typ das Drag and Drop sein kann. Der Inhalt kann ein beliebiges Objekt sein, der Typ oder die Typen müssen aus der DragDropEffects-Enumeration sein und können mit or verknüpft werden.
Im DragEnter-Event des Zielcontrols richtet man jetzt die Wirkung ein, die das Droppen anrichten soll. Hier kann über die Keystate-Eigenschaft des DragEventArgs überprüft werden, ob ggf. Steuertasten gedrückt sind und dem entsprechend der Effekt des Drag and Drop eingestellt werden. Hier sollte auch überprüft werden, ob der Inhalt des Events zum Control passt.
Der eigentliche Drop passiert im DragDrop-Event. Hier werden die auszuführenden aktionen implementiert, abhängig vom gewählten Effekt.
Im folgenden kleinen Beispiel kann der Text aus Textbox1 entweder in Textbox2 kopiert oder verschoben werden, abhängig davon, ob die Shift-Taste oder die Ctrl-Taste gedrückt ist:
' Initialisieren des Drag and Drop - Vorgangs beim Drücken der linken Maustaste ' könnte aber auch für jedes andere Event gemacht werden Private Sub TextBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDo ' Aktivieren des Drag & Drop Vorgangs mit der DoDragDrop-Methode ' erster Parameter gibt den Inhalt an (kann beliebigs Objekt sein) ' zweiter Parameter gibt die erlaubten Effekte an, wie kopieren oder verschieben Me.TextBox1.DoDragDrop(TextBox1.Text, DragDropEffects.Copy Or DragDropEffects.Move) End Sub
' Wenn die Maus über der TextBox2 ist, konfigurieren wir das DragDrop-Event Private Sub TextBox2_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox2.DragOver 'abfragen, ob der Inhalt des DragDropEvents von Typ 'Text' ist (was anderes kann die TextBox ja nicht) If (e.Data.GetDataPresent(GetType(String))) Then ' abfragen, welche Taste gedrückt wird (4== shift) (8==Ctrl) If (e.KeyState And 4) = 4 Then ' shift wird gedrückt, dann soll verschoben werden e.Effect = DragDropEffects.Move ' mein Cursor für's verschieben Me.Cursor = movecur ElseIf (e.KeyState And 8) = 8 Then ' Ctrl wird gedrückt, dann soll kopiert werden e.Effect = DragDropEffects.Copy ' mein Cursor für's kopieren Me.Cursor = copycur End If Else ' falls der Inhalt kein Text ist, soll nichts passieren e.Effect = DragDropEffects.None End If End Sub
' der Drop-Vorgang für die Textbox2 Private Sub TextBox2_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox2.DragDrop ' beim Verschieben... If e.Effect = DragDropEffects.Move Then ' ...weisen wir der Textbox2 den Inhalt des EventArgs zu ... TextBox2.Text = e.Data.GetData(DataFormats.Text).ToString ' ... und löschen den Text der Textbox1 TextBox1.Text = "" ' beim Kopieren ... ElseIf e.Effect = DragDropEffects.Copy Then ' ...weisen wir nur der Textbox2 den Inahlt des EventArgs zu TextBox2.Text = e.Data.GetData(DataFormats.Text).ToString End If End Sub |