ドラッグ&ドロップで項目の順序を変更できるリストボックスを作成します。

AllowDropOtherBoxプロパティを作成することで、リストボックスを複数作成した場合、別のリストボックスに対してもドラッグ&ドロップで項目のコピーができるかも設定できるようにします。

リストボックスでドラッグ&ドロップで項目を入れ替えるために必要なこととは?

ドラッグ&ドロップを可能にするためには、AllowDropプロパティをtrueにする必要があります。それからDragOverイベントやDragDropイベントを処理する必要があるのですが、そのままではこれらのイベントは発生しません。DoDragDropメソッドを呼ぶ必要があります。

DoDragDropメソッドはどこで呼び出すか?

ではDoDragDropメソッドはどこで呼ぶのか? 他のサイトで公開されているサンプルプログラムではマウスがクリックされたときにDoDragDropメソッドを呼び出しているものもありますが、これだとマウスクリックに伴って発生する他のイベント(SelectedIndexChangedなど)が発生しなくなる場合があります。

そのためフィールド変数 bool isMouseDownを用意し、マウスボタンがおされたらこれをtrueにして離されたらfalseにしています。そしてisMouseDown == trueのときにMouseMoveイベントが発生したらドラッグが開始されたとみなしてDoDragDropメソッドを呼び出しています。

DoDragDropメソッドの引数と自作クラス DragedItemInfo

DoDragDropメソッドに渡す第一引数ですが、これはDragOverイベントやDragDropイベント発生時に取り出すことができます。ここではDragedItemInfoクラスのインスタンスを生成して、ここにドラッグが開始されたリストボックスとアイテムのインデックスを格納します。そうすればドロップされたときに項目を入れ替えるために必要な情報を取得することができます。

実際に作成したコード

使い方の一例

チェックボックス[他のリストボックスにもドロップできるようにする][移動ではなくコピーにする]のチェックを入れたり外したりして実際に移動やコピーができるか試してみてください。