C# ボタンコントロールにドラッグドロップをさせたい

投稿者: Anonymous

お世話になります。

フォーム上に貼り付けたボタンに、テキストファイルをドラッグドロップしてきて、
指定してあるテキストエディタをProcess.Startで立ち上げてファイルを開こうとしています。

ボタンを押すと、テキストエディタが開くということはできますが、それでは
エクスプローラーから編集したいファイルを開くということが一度にできません。

そのため、ボタンを単純にクリックすれば、引数なしで外部プログラムを起動させ、
ドラッグドロップならば引数付きで起動するようにしたいと思ったのですが…。

ボタン自体はドラッグドロップは受け付けないのでしょうか。
AllowDropをTrueにしただけでテストしても、ドラッグ時に×のマウスカーソルの
ままです。

実装そのものができないのでしょうか。
それとも、他に何か原因がありますでしょうか。

よろしくお願いいたします。

解決

AllowDropを設定しても、ドラッグイベントを処理しなければドロップすることはできません。以下を参考に実装してみて下さい。

private void Form1_Load(object sender, EventArgs e)
{
    button1.AllowDrop = true;

    // TODO:デザイナーで以下のイベントを登録する
    button1.DragEnter += button1_DragEnter;
    button1.DragOver += button1_DragEnter;
    button1.DragDrop += button1_DragDrop;
}


// DragEnter, DragOverの実装
void button1_DragEnter(object sender, DragEventArgs e)
{
    // 目的の操作(この場合はCopy)ができることと、
    // データの種類を確認する
    if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy
        && e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        // Copyのエフェクトを表示する
        e.Effect = DragDropEffects.Copy;
    }
    else
    {
        // 対応していない場合
        e.Effect = DragDropEffects.None;
    }
}
// DragDrop時の処理
void button1_DragDrop(object sender, DragEventArgs e)
{
    // DragEnterと同様の判定を行う
    if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy
        && e.Data.GetDataPresent(DataFormats.FileDrop, true))
    {
        // 実際にデータを取り出す
        var data = e.Data.GetData(DataFormats.FileDrop, true) as string [];

        // データが取得できたか判定する
        if (data != null)
        {
            foreach (var filePath in data)
            {
                Console.WriteLine(filePath);
            }
        }
}
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *