|
|||||
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 |