Изменение размера списка при перетаскивании

#vb.net

#vb.net

Вопрос:

У меня есть несколько списков в форме, между которыми я могу перетаскивать элементы. Перетаскивание части кода, похоже, работает нормально. После удаления элемента в listbox у меня выполняется процедура изменения размера listbox и изменения размеров списков в соответствии с их содержимым. Проблема, с которой я сталкиваюсь, заключается в том, что при перетаскивании элемента из LB1 (например) в LB2 размер LB1 изменяется так, как если бы в его списке был один дополнительный элемент. Я хотел бы предотвратить это, но я не уверен, как. Вот код изменения размера:

     Private Sub ListBox_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseDown, ListBox2.MouseDown

    Dim Lbx As ListBox = sender
    Dim Pt As New Point(e.X, e.Y) ' Returns coords of mouse 
    Dim Idx As Integer
    Dim retval As DragDropEffects

    ' Determine which listbox item was dragged 
    Idx = Lbx.IndexFromPoint(Pt)

    ' Start a Drag and drop with that item 
    If Idx >= 0 Then
        ' 
        retval = Lbx.DoDragDrop(Lbx.Items(Idx), DragDropEffects.All)
        Debug.WriteLine(retval)
        If retval And DragDropEffects.Move Then
            Lbx.Items.RemoveAt(Idx)
        End If
    End If

End Sub

Private Sub ListBox_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox1.DragEnter, ListBox2.DragEnter
    If (e.Data.GetDataPresent(DataFormats.Text)) Then
        e.Effect = DragDropEffects.Move Or DragDropEffects.Copy
    End If
End Sub


Private Sub ListBox_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox1.DragDrop, ListBox2.DragDrop
    Dim LB As ListBox = sender
    LB.Items.Add(e.Data.GetData("Text"))
    QueueResize()
End Sub
  

И вот код для изменения размера:

     Private Sub QueueResize()
    For Each cont As System.Windows.Forms.Control In Panel1.Controls
        If cont.GetType.ToString = "System.Windows.Forms.ListBox" Then

            Dim LB As ListBox = cont
            On Error GoTo ErrHandler

            Dim lItemHeight As Long
            Dim lRet As Long
            Dim lItems As Long
            Dim sngTwips As Single
            Dim sngLBHeight As Single

            If LB.Items.Count = 0 Then
                LB.Height = 25
                'Return True

            Else
                lItems = LB.Items.Count

                lItemHeight = LB.ItemHeight
                If lItemHeight > 0 Then
                    LB.Height = lItemHeight * lItems   5
                    'AutoSizeLBHeight = True
                End If
            End If
        End If
    Next
ErrHandler:
End Sub
  

Будем признательны за любую помощь! Заранее спасибо.

Комментарии:

1. Это просто потому, что элемент еще не удален. Измените размер первого списка после Lbx. Товары. Удалить (Idx)

Ответ №1:

Добавьте в форму два элемента управления представлением списка. Установите для свойства AllowDrop каждого элемента управления представлением списка значение true. Установите для свойства MultiSelect каждого элемента управления представлением списка значение true. Установите для свойства View каждого элемента управления List View значение List. Добавьте следующий код:

Открытый класс Form1

 Private Sub ListView1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListView1.DragDrop, ListView2.DragDrop
    Dim myItem As ListViewItem
    Dim myItems() As ListViewItem = e.Data.GetData("System.Windows.Forms.ListViewItem()")
    Dim i As Integer = 0

    For Each myItem In myItems
        ' Add the item to the target list.
        sender.Items.Add(myItems(i).Text)
        ' Remove the item from the source list.
        If sender Is ListView1 Then
            ListView2.Items.Remove(ListView2.SelectedItems.Item(0))
        Else
            ListView1.Items.Remove(ListView1.SelectedItems.Item(0))
        End If
        i = i   1
    Next
End Sub

Private Sub ListView1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListView1.DragEnter, ListView2.DragEnter
    ' Check for the custom DataFormat ListViewItem array.
    If e.Data.GetDataPresent("System.Windows.Forms.ListViewItem()") Then
        e.Effect = DragDropEffects.Move
    Else
        e.Effect = DragDropEffects.None
    End If
End Sub

Private Sub ListView1_ItemDrag(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles ListView2.ItemDrag, ListView1.ItemDrag
    Dim myItem As ListViewItem
    Dim myItems(sender.SelectedItems.Count - 1) As ListViewItem
    Dim i As Integer = 0

    ' Loop though the SelectedItems collection for the source.
    For Each myItem In sender.SelectedItems
        ' Add the ListViewItem to the array of ListViewItems.
        myItems(i) = myItem
        i = i   1
    Next
    ' Create a DataObject containg the array of ListViewItems.
    sender.DoDragDrop(New  _
    DataObject("System.Windows.Forms.ListViewItem()", myItems), _
    DragDropEffects.Move)
End Sub
  

Завершить класс