Windows Formアプリケーションでエクスプローラーからファイルのドラッグ&ドロップを受け入れる
Windows Formアプリケーションでエクスプローラからのファイルのドラッグ&ドロップを受け入れるコードを紹介します。
概要
Windows Form アプリケーションでエクスプローラからのファイルのドラッグ&ドロップを受け入れる場合は、メインフォームのDragEnterイベントでエクスプローラからの要素の受け入れを許可し、メインフォームのDragDropイベントでドロップされたアイテムの取得処理を実装します。
プログラム例
UI
下図のUIを準備します。
フォームの[AllowDrop]プロパティを"True"に変更します。
コード
フォームの"DragDrop"イベントハンドラと"DragEnter"イベントハンドラを実装します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace AcceptDragAndDrop
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void FormMain_DragDrop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false );
for (int i=0; i<files.Length; i++){
string fileName = files[i];
textBox1.Text += fileName+"\r\n";
}
}
private void FormMain_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
e.Effect = DragDropEffects.All;
}
else {
e.Effect = DragDropEffects.None;
}
}
}
}
解説
DragEnter イベント
DataFormats.FileDropを与えて、GetDataPresent()メソッドを呼び出します。
エクスプローラからのファイルのドロップの場合はtrueを返すので、その場合はマウスポインタの形状を変更しドラッグ&ドロップを受け入れます。
if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
e.Effect = DragDropEffects.All;
}
else {
e.Effect = DragDropEffects.None;
}
DragDrop イベント
GetData()メソッドを呼び出して、ドロップされたファイルのファイル名を取得します。GetDataの戻り値はstring型の配列であり、複数のファイルがドロップされた場合にはドロップされた複数のファイル名が取得できます。
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
GetDataにより取得したString型の配列から要素を取り出し、テキストボックスに表示します。
for (int i = 0; i < files.Length; i++) {
string fileName = files[i];
textBox1.Text += fileName + "\r\n";
}
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
エクスプローラでファイルを表示しします。
エクスプローラでファイルを選択しアプリケーションのウィンドウへドラッグ&ドロップします。アプリケーションのウィンドウにマウスポインタが入ると下図のようにマウスポインタがドロップ受け入れ可能なカーソルに変わります。
ファイルのドロップが成功すると、テキストボックスにドロップしたファイルのフルパスが表示されます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用