NonSoft

ListBoxでドラッグ&ドロップするサンプル(VB.NET)


 サンプル(ソース/コード)
ListBoxにドラッグ&ドロップ機能を実装するサンプルソース(VB.NET)です。
ListBoxにはItemDragイベントが無いのでMouseDownやMouseMoveを使用して実装しました。
ListBox1からListBox2へのドラッグ&ドロップやListBox内でのドラッグが出来ます。

Formに2つのListBoxを貼り付けてお試しください。

関連サンプル:ListBoxでドラッグ&ドロップするサンプル(C#.NET)
関連サンプル:ListView/TreeView/ListBox/ComboBoxのサンプル(C#.NET)
関連サンプル:ListView/TreeView/ListBox/ComboBoxのサンプル(VB.NET)

★フォームクラス(Form1.vb)
Public Class Form1
    Private Sub Form1_Load( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load

        ' ListBox1に項目を追加
        ListBox1.Items.Add("ListBox1.Items(0)")
        ListBox1.Items.Add("ListBox1.Items(1)")
        ListBox1.Items.Add("ListBox1.Items(2)")
        ListBox1.Items.Add("ListBox1.Items(3)")
        ListBox1.Items.Add("ListBox1.Items(4)")
        ListBox1.AllowDrop = True

        ' ListBox2に項目を追加
        ListBox2.Items.Add("ListBox2.Items(0)")
        ListBox2.Items.Add("ListBox2.Items(1)")
        ListBox2.Items.Add("ListBox2.Items(2)")
        ListBox2.Items.Add("ListBox2.Items(3)")
        ListBox2.Items.Add("ListBox2.Items(4)")
        ListBox2.AllowDrop = True
    End Sub

    Private DragStartIdx As Integer = -1

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

        If e.Button = System.Windows.Forms.MouseButtons.Left Then
            ' マウスの左ボタンを押した時にListBoxの項目番号を保存
            DragStartIdx = sender.IndexFromPoint(New Point(e.X, e.Y))
        Else
            ' それ以外の時は何もしない
            DragStartIdx = -1
        End If
    End Sub

    Private Sub ListBox1_MouseUp( _
        ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.MouseEventArgs) _
        Handles ListBox1.MouseUp, ListBox2.MouseUp

        ' マウスのボタンを上げた時は初期状態へ
        DragStartIdx = -1
    End Sub

    Private Sub ListBox1_MouseMove( _
        ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.MouseEventArgs) _
        Handles ListBox1.MouseMove, ListBox2.MouseMove

        If e.Button = System.Windows.Forms.MouseButtons.Left And DragStartIdx >= 0 Then

            If (Control.ModifierKeys And Keys.Control) = Keys.Control Then
                ' Ctrlキーを押している時はドラッグ&ドロップ
                sender.DoDragDrop( _
                    sender.Items(DragStartIdx).ToString(), DragDropEffects.All)
            Else
                ' Ctrlキーを押していない時はListBox内のドラッグ
                Dim DragEndIdx As Integer = _
                    sender.IndexFromPoint(New Point(e.X, e.Y))

                If DragStartIdx >= 0 And DragEndIdx >= 0 And _
                   DragStartIdx <> DragEndIdx Then
                    If DragStartIdx < DragEndIdx Then
                        sender.Items.Insert(DragEndIdx + 1, _
                            sender.Items(DragStartIdx).ToString())
                        sender.SelectedIndex = DragEndIdx + 1
                        sender.Items.RemoveAt(DragStartIdx)
                    ElseIf DragStartIdx > DragEndIdx Then
                        sender.Items.Insert(DragEndIdx, _
                            sender.Items(DragStartIdx).ToString())
                        sender.SelectedIndex = DragEndIdx
                        sender.Items.RemoveAt(DragStartIdx + 1)
                    End If
                    DragStartIdx = DragEndIdx
                End If
            End If
        End If
    End Sub

    Private Sub ListBox1_DragEnter( _
        ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.DragEventArgs) _
        Handles ListBox1.DragEnter, ListBox2.DragEnter

        ' ドラッグ中にListBox内に入って来た時はドロップ許可
        e.Effect = DragDropEffects.Move
    End Sub

    Private Sub ListBox1_DragDrop( _
        ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.DragEventArgs) _
        Handles ListBox1.DragDrop, ListBox2.DragDrop

        ' ドラッグ中にマウスのボタンを上げた時はドロップ(最終行への追加)
        sender.Items.Add(e.Data.GetData(DataFormats.Text, True))
    End Sub
End Class