Rubrik: Maus & Tastatur · Drag & Drop | VB-Versionen: VB2005, VB2008 | 17.07.09 |
Drag & Drop zwischen zwei ListBoxen Dieser Tipp zeigt, wie man Einträge mittels Drag & Drop zwischen zwei ListBoxen kopieren bzw. verschieben kann. | ||
Autor: Dieter Otter | Bewertung: | Views: 16.122 |
www.tools4vb.de | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Heute zeigen wir Ihnen, wie man den selektierten Eintrag aus einer ListBox via Drag & Drop in eine zweite ListBox verschieben bzw. kopieren kann.
Hierbei soll folgendes gelten:
Wird der Eintrag mit der Maus bei gedrückter Strg-Taste in die zweite ListBox gezogen, soll der Eintrag kopiert werden. Andernfalls soll der Eintrag in die zweite ListBox verschoben werden.
Platzieren Sie zwei ListBoxen auf die Form und fügen nachfolgenden Code in den Code-Teil der Form ein:
Public Class Form1 ' aktuelle Mauszeiger-Position Private mPoint As Point
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' ListBox1 mit ein paar Einträgen füllen With ListBox1.Items For i As Integer = 1 To 15 .Add("Eintrag " & CStr(i)) Next End With ' ListBox2 soll Daten via Drag & Drop empfangen können ListBox2.AllowDrop = True End Sub
Private Sub ListBox1_MouseDown(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseDown ' bei gedrückter linker Maustaste, Koordinaten merken If e.Button = Windows.Forms.MouseButtons.Left Then mPoint = e.Location End If End Sub
Private Sub ListBox1_MouseMove(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseMove ' Prüfen, ob Maus bei gedrückter Taste bewegt wurde ' Erst wenn die Maus mind. 5 Pixel bewegt wurde, ' Drag & Drop Vorgang einleiten If e.Button = Windows.Forms.MouseButtons.Left Then If Math.Abs(e.X - mPoint.X) >= 5 OrElse Math.Abs(e.Y - mPoint.Y) >= 5 Then With ListBox1 If .SelectedIndex >= 0 Then .DoDragDrop(.SelectedItem.ToString, DragDropEffects.Copy Or DragDropEffects.Move) End If End With End If End If End Sub
Private Sub ListBox2_DragEnter(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox2.DragEnter ' Prüfen, ob das Data-Objekt "Text" enthält If e.Data.GetDataPresent(DataFormats.Text) Then ' Drag & Drop zulassen If (e.KeyState And 8) = 0 Then ' Verschieben e.Effect = DragDropEffects.Move Else ' bei gedrückter STRG-Taste, Kopieren e.Effect = DragDropEffects.Copy End If Else ' keine Drag & Drop Aktion zulassen e.Effect = DragDropEffects.None End If End Sub
Private Sub ListBox2_DragDrop(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox2.DragDrop ' Data-Objekt auslesen Dim sItem As String = e.Data.GetData(DataFormats.Text) With ListBox2 ' Eintrag unter dem Mauszeiger ermitteln Dim p As Point = .PointToClient(Cursor.Position) Dim index As Integer = .IndexFromPoint(p) If index < 0 Then ' ans Ende der Liste anfügen .Items.Add(sItem) Else ' an aktuelle Position einfügen .Items.Insert(index, sItem) End If ' ist die STRG-Taste nicht gedrückt, soll der Eintrag ' von der ListBox1 in die ListBox VERSCHOBEN werden, d.h. ' es muss der selektierte Eintrag aus der 1. ListBox ' gelöscht werden If e.Effect = DragDropEffects.Move Then ListBox1.Items.RemoveAt(ListBox1.SelectedIndex) End If End With End Sub
End Class