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

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

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

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

わんくま勉強会 C#

Drop

サンプル通り!しかしフォルダをドラッグしてみると

前回MSのサンプルに乗っているドラッグ&ドロップの方法を書きました。

しかし、この方法でも今回のケースは最適ではありません。

この実装では、フォルダがドラッグされた時にドロップ可能なアイコンに変わります。

しかし、実際ドロップしてみるとスルーされて何も起きません。

出来ないことはそもそもさせない

これを回避しようと思ったら、最初にドロップ時に書いた判定処理をドラッグ開始時にやる必要があります。

ドラッグされたものが存在するファイル名ならCopyする条件に変更します。

存在しないファイル名、つまりフォルダは無視されてドロップ可能なアイコンになりません。

これでやっと無駄な操作はなくなります。以下のソースで、今回のドラッグ&ドロップの完成です。

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

private void textBox1_DragDrop(object sender, DragEventArgs e)
{
    textBox1.Text = dropFileName;
}

出来ないことは出来ないと教えてあげる

最初はただ実装しました。その方法でもエラーは起きませんでした。

しかし、エラーでは無いですが、操作してもスルーされるという状況が起きました。

今回はスルーされる処理は出来なくするというスタイルにしましたが、状況によってはこれが最善ではありません。

例えばスルーの場合、操作後にそれは出来ないですとメッセージボックスを出す方が親切な時もあります。

エラー処理は試行錯誤

先に操作を出来なくするか、操作をさせた後にメッセージボックスで警告するか。

エラー処理の最善は条件や使用者によっても変化してしまうので、選択が結構難しい所です。

最初はメッセージボックスが良くても、一度分かったユーザーにとっては邪魔になることもあります。

全く知らないユーザーにさわらせて、それを後ろで見ていると結構参考になります。