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