Перемещение элементов управления FlowLayoutPanel с помощью DragDrop

У меня есть FlowPanelLayout, который может содержать несколько пользовательских элементов управления, называемых DataGridViewFilterSortElement. Эти элементы управления выглядят как кнопки, но отличаются. Я хочу, чтобы пользователь мог щелкнуть один из элементов управления DataGridViewFilterSortElement и перетащить его в другую позицию (индекс) в FlowLayoutPanel.

Есть ли способ увидеть, как элемент управления физически перемещается, когда пользователь перетаскивает его в другое место? Другими словами, есть ли способ сделать «моментальный снимок» перетаскиваемого элемента управления (вместо затененного прямоугольника), который показал бы фактическое перемещение элемента управления при перемещении курсора? Кроме того, поскольку элемент управления перетаскивается, я хотел бы, чтобы другие элементы управления автоматически смещались, вместо того, чтобы ждать, пока пользователь отпустит перетаскивание, чтобы увидеть сдвиги.

Например, предположим, что FlowPanelLayout содержит 3 элемента управления, и пользователь хочет перетащить первый элемент управления на позицию третьего элемента управления. Таким образом, пользователь щелкает и удерживает первый элемент DataGridViewFilterSortElement, затем перетаскивает второй элемент управления, что приводит к смещению второго элемента управления в положение 1 из 3, затем пользователь перетаскивает третий элемент управления, в результате чего третий элемент управления смещается в положение 2 из 3, то пользователь опускает регулятор в положение 3. Возможно ли это? Небольшой код, который у меня есть, приведен ниже.

Вот короткое видео, в котором показано, что я хочу сделать: http://www.youtube.com/watch?v=YhyTni6KH0Q

    Private Sub lblDescription_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown, lblDescription.MouseDown
    ' if the user left clicks and holds the element begin a DragDrop action
    If e.Button = Windows.Forms.MouseButtons.Left Then
        Me.DoDragDrop(Me, DragDropEffects.Move)
    End If
End Sub

Private Sub SortFlowLayoutPanel_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Me.DragOver
    e.Effect = DragDropEffects.Move
End Sub

Private Sub SortFlowLayoutPanel_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles SortFlowLayoutPanel.DragDrop

        If e.Data.GetData(GetType(DataGridViewFilterSortElement)) IsNot Nothing Then

            'Current Position           
            Dim myIndex As Integer = Me.SortFlowLayoutPanel.Controls.GetChildIndex(CType(e.Data.GetData(GetType(DataGridViewFilterSortElement)), DataGridViewFilterSortElement))

            'Dragged to control to location of next picturebox
            Dim element As DataGridViewFilterSortElement = CType(e.Data.GetData(GetType(DataGridViewFilterSortElement)), DataGridViewFilterSortElement)

            Me.SortFlowLayoutPanel.Controls.SetChildIndex(element, myIndex)
        End If

End Sub

Private Sub SortFlowLayoutPanel_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles SortFlowLayoutPanel.DragOver
    e.Effect = DragDropEffects.Move
End Sub

person Ryan Hennings    schedule 24.04.2012    source источник


Ответы (1)


На этой странице объясняется, как сделать то, что вы хотите. Я пробовал, выглядит неплохо. http://www.vbdotnetforums.com/gui/45818-flowlayoutpanel-repositioning-object.html

person DontFretBrett    schedule 06.08.2012
comment
К вашему сведению, используя этот метод, вы должны перетащить элемент управления поверх другого, положение которого вы хотите занять. Итак, если у вас есть 3 кнопки и вы хотите, чтобы 1-я была 3-й, вы перетаскиваете 1-ю на 3-ю. Это не позволяет вам бросить его куда-либо после последнего элемента управления, чтобы он стал последним, что было бы идеально. - person DontFretBrett; 07.08.2012
comment
404 - похоже, что ссылка уже мертва. - person Jeff Roe; 12.07.2017
comment
Возможно, где-то удастся найти его кешированную версию, но да, это было почти 5 лет назад. - person DontFretBrett; 13.07.2017