Windowsで良く利用されるドラッグ&ドロップ機能は、自作プログラムでも使いたいですよね。
でも、コントロールごとのイベントの許可とイベントの記述しなければならないため、初心者にとっては敷居が高くなりがちです。
他のサイトでは、ドラッグ&ドロップの説明やイベントハンドラのサンプルが多く、実際に使うためには中身を詳しく見ていかなければなりません。
ということで、このサイトでは瞬殺で実装できるよう関数化しました。
以前、こちらの記事で紹介したコードをWindowsForm用に修正したものになります。
自分のプログラムに簡単に組み込みたいと考えている方には、是非ご活用ください。
尚、WPFのドラッグ&ドロップについては、こちらをご覧ください。
ドラッグ & ドロップの動作
次の動画を見て頂いた通り、「商品マスタ.CSV」というファイルをコントロールにドラッグすると、マウスのアイコンが「ドラッグ&ドロップ」用のアイコンに変わります。
そして、コントロールの上で「ドロップ」すると、「商品マスタがDragDropされました」というアラートが表示されていますね。
コントロールに対してドラッグ&ドロップに対応させるには、
- Arrow.Drop プロパティをTrueにする
- ドラッグイベントでマウスカーソルのアイコンを「ドラッグ&ドロップ」用のアイコンに変更する
- ドロップイベントの中で、ドロップされたオブジェクト(今回はファイル名)を受取って処理する
という処理が必要になるのですが、今回紹介する関数の引数にコントロールを渡してあげるだけで、これらの処理がおこなわれるようになっています。
ドラッグ & ドロップ機能をコントロールに付与するコード
詳細の説明は後ほど行いますが、ここでは使い方と付与するコードの中身について簡単に紹介しておきます。
使い方
使い方は非常に簡単で、EnableDragDropという関数の引数にコントロールを渡すだけです。
この関数を使うことで、引数で指定したコントロールがドラッグ&ドロップの受け付け可能状態になるため、コンストラクタか フォームのLoadedイベントハンドラに記述するのが良いと思います。
1 2 3 4 |
private void Form1_Load(object sender, EventArgs e) { EnableDragDrop(dataGridView1); } |
ソースコード
ソースコードは次の通りです。
Visual Studio でイベントハンドラを作成し、必要な処理をイベントハンドラ内に記述していく必要があるのですが、それを全て関数内で行っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
private void EnableDragDrop(Control control) { //ドラッグ&ドロップを受け付けられるようにする control.AllowDrop = true; //ドラッグが開始された時のイベント処理(マウスカーソルをドラッグ中のアイコンに変更) control.DragEnter += (s, e) => { //ファイルがドラッグされたとき、カーソルをドラッグ中のアイコンに変更し、そうでない場合は何もしない。 e.Effect = (e.Data.GetDataPresent(DataFormats.FileDrop)) ? DragDropEffects.Copy : e.Effect = DragDropEffects.None; }; //ドラッグ&ドロップが完了した時の処理(ファイル名を取得し、ファイルの中身をTextプロパティに代入) control.DragDrop += (s, e) => { if (e.Data.GetDataPresent(DataFormats.FileDrop)) // ドロップされたものがファイルかどうか確認する。 { string[] paths = ((string[])e.Data.GetData(DataFormats.FileDrop)); //-------------------------------------------------------------------- // ここに、ドラッグ&ドロップ受付時の処理を記述する //-------------------------------------------------------------------- } }; } |
ドラッグ&ドロップの際に行わせたい処理は「ここに、ドラッグ&ドロップ受付時の処理を記述する」と書いてある部分に記述して下さい。
解説
処理を出来るだけ簡単に済ませるために、 DragEnter と DragDrop のイベントハンドラを記述しています。
DragEnter は、ファイルやフォルダをコントロール上にドラッグした時に発生するイベントで、e.Effect にDragDropEffects.Copy を設定することで、アイコンの形状を変えています。
DragDrop はドロップ時に発生するイベントで、GetData(DataFormats.FileDrop) メソッドによりファイル又はフォルダを取得しています。
尚、一回のドラッグ&ドロップで、複数ファイルや複数フォルダが渡される可能性があるので、GetDataの戻り値は文字列配列となっています。
どのコントロールに対応しているか
今回のデモ画面では、以下のコントロールを張り付けて確認しています。
TextBox、ComboBox、Label、CheckListBox、DataGridView、ListBox、LitchTextBox、TabPage、PictureBox、Panel
デモ画面にはありませんが、TreeViewとListView についても動作確認していますので、ほとんどのコントロールについて動作するのではないかと思います。
サンプルソース一式
今回紹介した関数とデモプログラムは、次のリンクからプロジェクト一式をダウンロードできます。
DragDrop関数とデモプログラム(WindowsForm)
まとめ
今回はWindowsFormによるWindowアプリに対して、簡単にドラッグ&ドロップが組み込む関数を紹介しました。
関数をコピー&ペーストし、コンストラクタもしくは フォームのLoaded イベントで EnableDragDrop を呼び出すだけで簡単に実現できます。
コントロール毎にドラッグ&ドロップのイベントハンドラを書くの結構面倒であり、複数のコントロールをドラッグ&ドロップに対応させるとイベントハンドラだらけになってしまうので、関数化しておけばプログラムがすっきりします。
皆さんの自作プログラム作成において、是非ご利用下さい。
コメント