Перетащите на FlowLayoutPanel

привет ребята надеюсь все хорошо

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

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

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

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

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

КПБ: CustomPictureBox


person Aiden Strydom    schedule 10.09.2011    source источник
comment
Это то, для чего было создано перетаскивание, хорошо поддерживаемое в .NET.   -  person Hans Passant    schedule 11.09.2011


Ответы (2)


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

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

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

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

person Qqbt    schedule 10.09.2011
comment
Спасибо за ваш быстрый ответ - но поправьте меня, если я ошибаюсь - e не является объектом, это EventArgs - .net не позволит вам скомпилировать (снова поправьте меня, если я ошибаюсь). возвращает меня в cpb - person Aiden Strydom; 11.09.2011
comment
Я пробовал это, я имею в виду, что .net не позволил мне это сделать. Но я буду продолжать в том же духе - person Aiden Strydom; 11.09.2011
comment
******* Возможно, я забыл упомянуть ********** cpb.IntersectingObejcts — это общая функция в классе CPB, которая проверяет, не пересекается ли с ней что-либо — возможно, мне следует сделать то же самое для класс ФЛП - person Aiden Strydom; 11.09.2011
comment
Все заработало — спасибо, ребята — все, что я сделал, это создал производный класс от FlowLayoutPanel, добавил общую функцию IntersectingObjects, если функция возвращает true. - person Aiden Strydom; 11.09.2011
comment
@Aiden Sry Aiden, я не имел в виду e, я имел в виду отправителя, извините за это, проверьте код сейчас - person Qqbt; 11.09.2011
comment
Здравствуйте, я думал, вы имели в виду отправителя. В любом случае - вот окончательный РАБОЧИЙ код - только код для класса CustomFlowLayoutPanel::IntersectingObject If CustomPic.Bounds().IntersectsWith(objectbox.Bounds()) Then Return True Else Return False End If - person Aiden Strydom; 11.09.2011

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

    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

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

person ZStinger    schedule 18.04.2017