Перейти на FlowLayoutPanel - PullRequest
       9

Перейти на FlowLayoutPanel

1 голос
/ 11 сентября 2011

Привет, ребята. Надеюсь, все хорошо

Мне интересно (борется) следующее:

У меня есть 5 flowLayoutPanels и 5 PictureBox, я хочу иметь возможность перемещать любой из графических блоков над любым FLP во время выполнения и сделать так, чтобы панель макета добавила его в FLP.controls.Add () ....

Я занимался этим часами, а теперь плохо глотаю свою гордость -

Я сделал следующее, чтобы заставить его работать, но здесь я должен вручную указать, какой PixBox пересекается с каким FLP, и я не хочу 25, если операторы

Private Sub cpbPic1_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles cpbPic1.MouseUp
    If (flpDock1.HasChildren = False) Then 'Test to see if panel is filled
        If CBool(CustomPictureBox.IntersectingObjects(cpbPic1, flpDock1)) Then
            flpDock1.Controls.Add(cpbPic1) 'Add Pic to Panel
    End If
End Sub

cpb: CustomPictureBox

Ответы [ 2 ]

1 голос
/ 18 апреля 2017

ну, это может быть обходной путь для того, что вы хотите сделать. Вы также должны включить разрешение на панели расхода

    Private Function FindControl(ByVal ControlName As String, ByVal CurrentControl As Control) As Control 
' get the control you need
    Dim ctr As Control
    For Each ctr In CurrentControl.Controls
        If ctr.Name = ControlName Then
            Return ctr
        Else
            ctr = FindControl(ControlName, ctr)
            If Not ctr Is Nothing Then
                Return ctr
            End If
        End If
    Next ctr
End Function

Private Sub me_DragEnter(sender As Object, e As DragEventArgs) Handles FLP1.DragEnter,FLP2.DragEnter,FLP3.DragEnter
' call the copy effect
    If (e.Data.GetDataPresent(DataFormats.Text)) Then
        e.Effect = DragDropEffects.Copy
    End If
End Sub
Private Sub me_DragDrop(sender As Object, e As DragEventArgs) Handles FLP1.DragDrop,FLP2.DragDrop,FLP3.DragDrop
' get the FLp you're gonna drop the control onto
    Dim c As control =FindControl(e.Data.GetData(DataFormats.Text), me)
    sender.Controls.Add(c)
    end sub


    Private Sub Pictureboxs_MouseDown(sender As Object, e As MouseEventArgs) Handles Label1.MouseDown, PB.MouseDown
    sender.DoDragDrop(sender.Name, DragDropEffects.Copy)

End Sub

надеюсь, что это поможет вам :) (извините за мой плохой английский)

1 голос
/ 11 сентября 2011

вы всегда можете сделать это:

Private Sub cpbPic1_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles cpbPic1.MouseUp, cpbPic2.MouseUp, cpbPic3.MouseUp,cpbPic4.MouseUp,cpbPic5.MouseUp
    If Not flpDock1.HasChildren Then 'Test to see if panel is filled
        If CBool(CustomPictureBox.IntersectingObjects(TryCast(sender,CustomPictureBox), flpDock1)) Then
            flpDock1.Controls.Add(TryCast(sender,CustomPictureBox)) 'Add Pic to Panel
    End If
End Sub

Это значительно сократит объем кода, который вам придется писать, вы можете еще больше уменьшить этот объем, если подумаете о том, как использовать тот факт, что обработчик событий передает объект, который поднимает флаг, как я сделал здесь.

Также вы можете использовать произвольно большое количество (я думаю) объектов в обработчике, если они вызывают одно и то же событие

...