VB.NET优化拖动&丢弃代码

时间:2015-12-08 18:33:20

标签: vb.net drag-and-drop

我目前正在努力克服拖累丢弃代码。我有三个位于顶部的图像,我想在流程布局面板中以随机顺序添加它们。

enter image description here

我有这个代码用于将方形图像添加到流布局面板中,但我感觉这不是100%正确。是否可以使用1 sub而不是3?

添加这些

你如何编写一个检测被拖动物体的子?现在我的sub只为每个dragdrop事件添加一个正方形。但是我需要它才能在拖曳方形时拖拽方形而拖动梯形或圆形拖拽它。

Public Class Form2

Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
    ' Initiate dragging.
    PictureBox1.DoDragDrop(PictureBox1, DragDropEffects.Copy)
End Sub

Private Sub PictureBox2_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox2.MouseMove
    ' Initiate dragging.
    PictureBox2.DoDragDrop(PictureBox2, DragDropEffects.Copy)
End Sub

Private Sub PictureBox3_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox3.MouseMove
    ' Initiate dragging.
    PictureBox3.DoDragDrop(PictureBox2, DragDropEffects.Copy)
End Sub

Private Sub FlowLayoutPanel1_DragEnter(ByVal sender As Object, ByVal e As _
                                       System.Windows.Forms.DragEventArgs) Handles FlowLayoutPanel1.DragEnter
    ' Check the format of the data being dropped.
    If (e.Data.GetDataPresent(GetType(PictureBox))) Then
        ' Display the copy cursor.
        e.Effect = DragDropEffects.Copy
    Else
        ' Display the no-drop cursor.
        e.Effect = DragDropEffects.None
    End If
End Sub

Private Sub FlowLayoutPanel1_DragDrop(ByVal sender As Object, ByVal e As _
                                      System.Windows.Forms.DragEventArgs) Handles FlowLayoutPanel1.DragDrop
    Dim oPB As New PictureBox()
    oPB.Image = Image.FromFile("C:\Users\Jef\Desktop\square.jpg")
    oPB.Visible = True
    oPB.Width = 100
    oPB.Height = 100
    oPB.SizeMode = PictureBoxSizeMode.CenterImage


    FlowLayoutPanel1.Controls.Add(oPB)

End Sub

1 个答案:

答案 0 :(得分:1)

You already got the answer in your previous question:

    class Baos extends ByteArrayOutputStream {
        def getbuf = buf // expose the buffer
    } 

You do have a bug, the probable reason why you did not use the answer:

Private Sub FlowLayoutPanel1_DragDrop(ByVal sender As Object, ByVal e As _
                                      System.Windows.Forms.DragEventArgs) Handles FlowLayoutPanel1.DragDrop
    Dim oPB As New PictureBox()
    Dim pb = CType(e.Data.GetData(GetType(PictureBox)))
    oPB.Image = pb.Image
    pb.Image = Nothing     '' Optional
    '' etc...
End Sub

Note how it drags the wrong control, PictureBox2 instead of PictureBox3. You avoid bugs like this by writing DRY code, Do not Repeat Yourself. The sender argument of a MouseMove event already gives you a reference to the control. So you just need one event handler for all three controls:

Private Sub PictureBox3_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox3.MouseMove
    ' Initiate dragging.
    PictureBox3.DoDragDrop(PictureBox2, DragDropEffects.Copy)
End Sub

With the detail that we now let the Form support DoDragDrop(). Which only matters if you implement the GiveFeedback or QueryContinueDrag events.