Используя элемент управления flowlayoutpanel в качестве контейнера, а затем создайте пользовательский элемент управления, который является элементом списка, вы находитесь на полпути. Пользовательский контроль может иметь любой вид, который вы хотите, и будет действовать как элемент списка в панели потока. Тогда у нас есть перетаскивание. Следуя этому коду (обычно из этого примера: http://www.codeproject.com/KB/static/DragDropFlowLayoutPanel.aspx), вы добавите элементы перетаскивания в панель потока:
Сначала создайте новое решение windform, затем создайте пользовательский элемент управления только с меткой, мы используем его в качестве примера вашего специального элемента управления listitem. Назовите элемент управления MyListItem. Вставьте этот код в пользовательский контроль, чтобы сделать его перетаскиваемым:
Public Class MyListItem
Public Property AllowDrag() As Boolean
Get
Return m_AllowDrag
End Get
Set(ByVal value As Boolean)
m_AllowDrag = value
End Set
End Property
Private m_AllowDrag As Boolean
Private _isDragging As Boolean = False
Private _DDradius As Integer = 40
Private _mX As Integer = 0
Private _mY As Integer = 0
Public Sub New()
InitializeComponent()
Margin = New Padding(0)
AllowDrag = True
End Sub
Protected Overrides Sub OnGotFocus(ByVal e As EventArgs)
Me.BackColor = Color.Navy
End Sub
Protected Overrides Sub OnLostFocus(ByVal e As EventArgs)
Me.BackColor = Color.Transparent
End Sub
Protected Overrides Sub OnClick(ByVal e As EventArgs)
Me.Focus()
End Sub
Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
Me.Focus()
_mX = e.X
_mY = e.Y
Me._isDragging = False
End Sub
Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
If Not _isDragging Then
If e.Button = MouseButtons.Left AndAlso _DDradius > 0 AndAlso Me.AllowDrag Then
Dim num1 As Integer = _mX - e.X
Dim num2 As Integer = _mY - e.Y
If ((num1 * num1) + (num2 * num2)) > _DDradius Then
DoDragDrop(Me, DragDropEffects.All)
_isDragging = True
Return
End If
End If
End If
End Sub
Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
_isDragging = False
End Sub
End Class
Затем поместите flowlayoutpanel (flowlayoutpanel1) на основную форму в приложении.
Добавьте этот код в форму, он заполнит панель потока списками, которые вы можете перетаскивать:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
FlowLayoutPanel1.AllowDrop = True
For p As Integer = 0 To 50
Dim listitem As New MyListItem With {.Height = 50, .BorderStyle = BorderStyle.FixedSingle}
listitem.Label1.Text = "Item:" & p.ToString
FlowLayoutPanel1.Controls.Add(listitem)
Next
AddHandler FlowLayoutPanel1.DragEnter, AddressOf flowLayoutPanel_DragEnter
AddHandler FlowLayoutPanel1.DragDrop, AddressOf flowLayoutPanel1_DragDrop
End Sub
Sub flowLayoutPanel_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs)
e.Effect = DragDropEffects.All
End Sub
Private Sub flowLayoutPanel1_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs)
Dim data As MyListItem = CType(e.Data.GetData(GetType(MyListItem)), MyListItem)
Dim _destination As FlowLayoutPanel = CType(sender, FlowLayoutPanel)
Dim _source As FlowLayoutPanel = CType(data.Parent, FlowLayoutPanel)
If sender.Equals(data.Parent) Then
Dim p As Point = _destination.PointToClient(New Point(e.X, e.Y))
Dim item = _destination.GetChildAtPoint(p)
Dim index As Integer = _destination.Controls.GetChildIndex(item, False)
_destination.Controls.SetChildIndex(data, index)
_destination.Invalidate()
End If
End Sub
Теперь вы можете запустить программу и проверить. Теперь у вас есть «просмотр списка», в котором могут быть настроенные элементы управления, позволяющие перетаскивать элементы для изменения порядка элементов.
Кредит переходит к П.Сэндгрену за перетаскивание элементов на панели разметки:
http://www.codeproject.com/KB/static/DragDropFlowLayoutPanel.aspx