DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

エクスプローラへファイルをDrag&Dropする

エクスプローラへのドラッグ&ドロップも「 ドラッグ&ドロップを行う」で紹介したような通常のドラッグ&ドロップ同様、Control.DoDragDropメソッドで可能です。ただしDoDragDropメソッドを呼び出す時、データ形式にDataFormats.FileDropを、データにドロップ&ドラッグしたいファイルのフルパスのString型配列(ただのString型ではないことに注意してください)を指定して作成したDataObjectオブジェクトを使用します。

ファイルのフルパスのリストが表示されているリストボックスからエクスプローラへのファイルのドラッグ&ドロップを可能にするサンプルを以下に示します。このサンプルでは、フォーム(Form1)にリストボックス(ListBox1)が配置されている必要があります。フォームのLoadイベントハンドラでリストボックスにファイル名を表示し、リストボックスのMouseDownイベントハンドラでドラッグを開始するようにしています。ここでは一つのファイルしかドラッグ&ドロップできませんが、String型配列に複数のファイルのパスを指定すれば、複数のファイルのドラッグ&ドロップが可能です。

VB.NET
コードを隠すコードを選択
'フォームの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
C#
コードを隠すコードを選択
//フォームの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メソッドを使ってドラッグしたファイルが削除されたか調べるなどの方法が考えられます。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。