読者です 読者をやめる 読者になる 読者になる

森理 麟(moririring)のプログラマブログ

ゲームプログラマ森理 麟がのプログラムの話題を中心に書くブログです。

C#アプリの作り方入門〜「きほん」の「ほ」〜 その13 ドラッグ&ドロップ実装

Water Drop 3

ドロップチェック

次にDragDropイベントを作ります。これはドロップ時に呼ばれるイベントです。

先ずドロップされたものがファイルかどうかチェックします。

チェックはe.Data.GetDataPresent(DataFormats.FileDrop)で出来ます。

但し、このチェックでは厳密にはファイル以外もドロップされます。

ファイルだけをドロップさせる

DataFormats.FileDropの場合、ドロップされるものは3種類あります。

フォルダ名、ファイル名、複数ファイル名です。

そこで処理にファイルかどうかをチェックするメソッドをいれましょう。

そして、複数ファイルなら一つ目のファイルを強制的に表示しましょう。

private void textBox1_DragDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        string[] fileName = (string[])e.Data.GetData(DataFormats.FileDrop);
        if (System.IO.File.Exists(fileName[0]) == true)
        {
            textBox1.Text = System.IO.Path.GetDirectoryName(fileName[0]);
        }
    }
}

ファイル以外はスルーされる

これでドラッグ&ドロップすればテキストボックスにファイル名が入るようになりました。

しかし、この方法は少し甘い所があって、フォルダやファイル以外のものがドラッグされた場合は何もしません。

ドラッグ出来るのに、ドラッグした結果が何も出ずにそのままスルーされてしまいます。

何も反応しないなら最初からドラッグは出来ないと表示した方がユーザーフレンドリーです。

ドロップ時ではなくドラッグ開始時に

そこで判定をDragDropではなく、DragEnterで行います。

これでファイルならコピー、そうでなければドラッグ不可のアイコンになります。

こうすればドロップ時にFileDropかどうかの判定もいらなくなります。

これはマイクロソフトサンプルにのっている方法です。

private void textBox1_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
        e.Effect = DragDropEffects.All;
    else
        e.Effect = DragDropEffects.None;
}
private void textBox1_DragDrop(object sender, DragEventArgs e)
{
    string[] fileName = (string[])e.Data.GetData(DataFormats.FileDrop);
    if (System.IO.File.Exists(fileName[0]) == true)
    {
        textBox1.Text = fileName[0];
    }
}