2011-11-10 10 views
1

複数のリストボックスをフォームの中にドラッグアンドドロップすることができます。コードのドラッグ&ドロップの部分はうまくいくようです。リストボックスに項目をドロップすると、私はリストボックスのサイズ変更手続きを行って、その内容に合わせてリストボックスのサイズを変更します。私が取り組んでいる問題は、アイテムをLB1(例えば)からLB2にドラッグすると、LB1はあたかもそのアイテムのリストに余分なアイテムがあるかのようにサイズ変更されるということです。私はそれを防止したいと思いますが、どうしたらよいか分かりません。ここでサイズ変更コードは次のとおりです。ドラッグアンドドロップでListBoxのサイズを変更する

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 

任意の助けをいただければ幸いです!前もって感謝します。

+0

: は、次のコードを追加します。 Lbx.Items.RemoveAt(Idx)の後の最初のリストボックスのサイズを変更します。 –

答えて

0

2つのリストビューコントロールをフォームに追加します。 各リストビューコントロールのAllowDropプロパティをtrueに設定します。 各リストビューコントロールのMultiSelectプロパティをtrueに設定します。 各リストビューコントロールの[表示]プロパティを[リスト]に設定します。アイテムがまだ削除されていないので、これは単純である

パブリック・クラスの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 

エンドクラス

関連する問題