ドラッグ&ドロップを実装するには?

今日、ツールの改良でドラッグ&ドロップを実装しよう*1
ヘルプを見ながらやったのだが、うまく実装できなかった。
コントロールのプロパティにあるAllowDrop = Trueにして
イベントハンドラを実装するらしいのだが、
どうもDropEnter以降のイベントが走らない。
調べてみるとDropEnter*2時に続行するか止めるかを設定する必要があるようだ。
なんかウィンドウを閉じるときにCansel = Trueとかにすると
閉じなくなるのと同じだろう*3
なるほど。もしかしたらデフォルトでとめているのかもしれない。
とりあえずGoogleで調べた一部を↓に貼っておく。


実際にドラッグを開始するには、ドラッグされるアイテムのあるリストボックスのDoDragDropメソッドを呼び出します。ドロップを受け入れるリストボックスでは、リストボックス内にドラッグされた時にDragEnterイベントが発生しますので、ここでドロップを受け入れるか、受け入れるとしたらどのように受け入れるか(コピーか移動か等)を決定します。リストボックスにドロップされるとDragDropイベントが発生しますので、ここでドロップされたデータを取得し、リストボックスへデータを追加します。

(ソース一部抜粋)
.
.
.
'ListBox2内にドラッグされた時
Private Sub ListBox2_DragEnter( _
        ByVal sender As Object, ByVal e As DragEventArgs)
    'ドラッグされているデータがstring型か調べ、
    'そうであればドロップ効果をMoveにする
    If e.Data.GetDataPresent(GetType(String)) Then
        e.Effect = DragDropEffects.Move
    Else
        'string型でなければ受け入れない
        e.Effect = DragDropEffects.None
    End If
End Sub

'ListBox2にドロップされたとき
Private Sub ListBox2_DragDrop( _
        ByVal sender As Object, ByVal e As DragEventArgs)
    'ドロップされたデータがstring型か調べる
    If e.Data.GetDataPresent(GetType(String)) Then
        Dim target As ListBox = CType(sender, ListBox)
        'ドロップされたデータ(string型)を取得
        Dim itemText As String = _
            CStr(e.Data.GetData(GetType(String)))
        'ドロップされたデータをリストボックスに追加する
        target.Items.Add(itemText)
    End If
End Sub
http://dobon.net/vb/dotnet/control/draganddrop.html

他にも
Windowsフォームアプリケーションにドラッグ&ドロップ機能を実装する』のもあった。
こっちは画像で実装している。
ソースを見る限り、今日*4ヘルプで見たことのあるメソッドが並んでいる。
意味不明で使ってなかったけどそれがダメだったのか*5

最後に


↑最強すぎます。フネさんの『ARO☆』が好き。

*1:パス指定を毎回ダイアログで指定するのが面倒だったので

*2:ドロップ中のマウスがコントロールに入った

*3:感覚的に

*4:昨日か

*5:だってMSDNの文って、分かりにくいんだもん