エクスプローラへのドラッグ&ドロップも「 ドラッグ&ドロップを行う」で紹介したような通常のドラッグ&ドロップ同様、Control.DoDragDropメソッドで可能です。ただしDoDragDropメソッドを呼び出す時、データ形式にDataFormats.FileDropを、データにドロップ&ドラッグしたいファイルのフルパスのString型配列(ただのString型ではないことに注意してください)を指定して作成したDataObjectオブジェクトを使用します。
ファイルのフルパスのリストが表示されているリストボックスからエクスプローラへのファイルのドラッグ&ドロップを可能にするサンプルを以下に示します。このサンプルでは、フォーム(Form1)にリストボックス(ListBox1)が配置されている必要があります。フォームのLoadイベントハンドラでリストボックスにファイル名を表示し、リストボックスのMouseDownイベントハンドラでドラッグを開始するようにしています。ここでは一つのファイルしかドラッグ&ドロップできませんが、String型配列に複数のファイルのパスを指定すれば、複数のファイルのドラッグ&ドロップが可能です。
'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As EventArgs) Handles MyBase.Load 'MouseDownイベントハンドラを追加 AddHandler ListBox1.MouseDown, AddressOf ListBox1_MouseDown 'ListBox1に"C:\"にあるファイルを表示する ListBox1.Items.AddRange( _ System.IO.Directory.GetFiles("C:\", "*.*")) End Sub 'ListBox1のMouseDownイベントハンドラ Private Sub ListBox1_MouseDown(ByVal sender As Object, _ ByVal e As MouseEventArgs) Dim lbx As ListBox = CType(sender, ListBox) 'ドラッグするファイル名を取得する Dim itemIndex As Integer = lbx.IndexFromPoint(e.X, e.Y) If itemIndex < 0 Then Return End If Dim files As String() = {CStr(lbx.Items(itemIndex))} 'DataObjectを作成する Dim dataObj As New DataObject(DataFormats.FileDrop, files) 'ドラッグを開始する Dim dde As DragDropEffects = _ lbx.DoDragDrop(dataObj, DragDropEffects.Copy) End Sub
//フォームのLoadイベントハンドラ private void Form1_Load(object sender, System.EventArgs e) { //MouseDownイベントハンドラを追加 ListBox1.MouseDown += new MouseEventHandler(ListBox1_MouseDown); //ListBox1に"C:\"にあるファイルを表示する ListBox1.Items.AddRange( System.IO.Directory.GetFiles("C:\\", "*.*")); } //ListBox1のMouseDownイベントハンドラ private void ListBox1_MouseDown(object sender, MouseEventArgs e) { ListBox lbx = (ListBox) sender; //ドラッグするファイル名を取得する int itemIndex = lbx.IndexFromPoint(e.X, e.Y); if (itemIndex < 0) return; string[] files = {(string) lbx.Items[itemIndex]}; //DataObjectを作成する DataObject dataObj = new DataObject(DataFormats.FileDrop, files); //ドラッグを開始する DragDropEffects dde = lbx.DoDragDrop(dataObj, DragDropEffects.Copy); }
なお、ファイルを移動するためにDoDragDropメソッドでDragDropEffects.Moveを使用した場合、DoDragDropメソッドが返すDragDropEffectsの値はNoneになるようです(こちらを参照)(.NET Framework 1.1、2.0で確認)。ファイルを移動したかを調べるには、DoDragDropメソッドが終了してからFile.Existsメソッドを使ってドラッグしたファイルが削除されたか調べるなどの方法が考えられます。
(この記事は、「.NETプログラミング研究 第47号」で紹介したものを基にしています。)