Search code examples
vb.netdrag-and-dropdraggable

Drag-drop in vb.net


I am new in visual basic and I followed one article to write this code to drag and drop images.

But I want to add an if statement to control drag-drop, so if picture 1 goes to picture box 2, it will give a message that it's in the wrong place.

My code:

Public Class Form1

Private Source As PictureBox = Nothing

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    For Each PB As PictureBox In Me.Controls.OfType(Of PictureBox)()
        PB.AllowDrop = True
        AddHandler PB.MouseMove, AddressOf PBs_MouseMove
        AddHandler PB.DragEnter, AddressOf PBs_DragEnter
        AddHandler PB.DragDrop, AddressOf PBs_DragDrop
        AddHandler PB.DragOver, AddressOf PBs_DragOver
    Next
End Sub

Private Sub PBs_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    Dim PB As PictureBox = DirectCast(sender, PictureBox)
    If Not IsNothing(PB.Image) AndAlso e.Button = Windows.Forms.MouseButtons.Left Then
        Source = PB
        PB.DoDragDrop(PB.Image, DragDropEffects.Copy Or DragDropEffects.Move)
    End If
End Sub

Private Sub PBs_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs)
    If e.Data.GetDataPresent(DataFormats.Bitmap) Then
        If My.Computer.Keyboard.CtrlKeyDown Then
            e.Effect = DragDropEffects.Copy
        Else
            e.Effect = DragDropEffects.Move
        End If
    Else
        e.Effect = DragDropEffects.None
    End If
End Sub

Private Sub PBs_DragOver(ByVal sender As Object, ByVal e As DragEventArgs)
    If e.Data.GetDataPresent(DataFormats.Bitmap) Then
        If My.Computer.Keyboard.CtrlKeyDown Then
            e.Effect = DragDropEffects.Copy
        Else
            e.Effect = DragDropEffects.Move
        End If
    Else
        e.Effect = DragDropEffects.None
    End If
End Sub

Private Sub PBs_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs)
    Dim PB As PictureBox = DirectCast(sender, PictureBox)
    Dim tmpImage As Image = PB.Image ' store the current image
    PB.Image = e.Data.GetData(DataFormats.Bitmap) ' change it to the dropped image
    If e.Effect = DragDropEffects.Move Then
        If Not (PB Is Source) Then
            Source.Image = tmpImage ' put the stored image in the source picturebox (swap)
        End If
    End If
End Sub

End Class

Solution

  • You could try altering your PBs_DragDrop code to check which PictureBox is being dropped to like this

    Private Sub PBs_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs)
        Dim PB As PictureBox = DirectCast(sender, PictureBox)
        If PB Is PictureBox2 Then
            'handle mistake here
        Else
            Dim tmpImage As Image = PB.Image ' store the current image
            PB.Image = e.Data.GetData(DataFormats.Bitmap) ' change it to the dropped image
            If e.Effect = DragDropEffects.Move Then
                If Not (PB Is Source) Then
                    Source.Image = tmpImage ' put the stored image in the source picturebox (swap)
                End If
            End If
        End If
    End Sub