#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
Завершить класс