|
.NET TIPS エクスプローラからファイルをドラッグ&ドロップできるようにするには?[C#、VB]デジタルアドバンテージ 遠藤 孝信2007/11/29 |
![]() |
|
|
|
ファイルを扱うWindowsアプリケーションでは、エクスプローラからのドラッグ&ドロップ(以下、D&D)に対応することで、対象となるファイルの指定を簡単に行えるようにできる。
エクスプローラからファイルのD&Dを受け付けるようにするには、最低限、次の3つの作業を行えばよい。
- フォームのAllowDropプロパティをTrueに設定する
- フォームのDragEnterイベント・ハンドラを記述する
- フォームのDragDropイベント・ハンドラを記述する
以下では、2と3のイベント・ハンドラでの記述内容について解説する。
ちなみに、Visual Studioでフォームにイベント・ハンドラを追加するには、[プロパティ]ウィンドウの
ボタンをクリックしてイベント一覧を表示し、「DragEnter」や「DragDrop」の欄をマウスでダブルクリックすればよい。
DragEnterイベント・ハンドラの記述
DragEnterイベントは、ファイルをドラッグ中のマウス・カーソルがフォーム上に入ったときに発生する。
このときには、次のリスト1のように、ドラッグ中のデータ(e.Data)の形式がファイル(DataFormats.FileDrop)であることをGetDataPresentメソッドにより確認し、もしそうであれば、受け付けるドロップ操作(e.Effect)としてコピー(DragDropEffects.Copy)を設定する。
| ||
| リスト1 DragEnterイベント・ハンドラの記述例(上:C#、下:VB) |
このコードにより、ファイルをドラッグ中のマウス・カーソルには「+」マークが表示され、アプリケーションへのファイルのドロップが可能であることを示すようになる。「e.Effect」の初期値は「DragDropEffects.None」であるが、ここではこれ以外の値を設定しないと後続のDragDropイベントは発生しない。
ただし、リスト1のコードはエクスプローラからフォルダがドロップされた場合にも「+」マークが表示され、ドロップを受け付けてしまう。
厳密にファイルのみをドロップ可能にするには、次のリスト2のようにして、ドラッグ中のデータがすべてファイルかどうかをチェックする必要がある。
| ||
| リスト2 ファイルのみを受け付けるDragEnterイベント・ハンドラの記述例(上:C#、下:VB) |
リスト1では、ドラッグ中のデータの形式を確認するのにGetDataPresentメソッドを使用したが、そのデータの内容を取得する場合にはGetDataメソッドを使用する。このメソッドの戻り値の型はObject型だが、データがファイル形式の場合(パラメータにDataFormats.FileDropを指定した場合)には、戻り値はファイルやディレクトリのパス(文字列)の配列となるので、文字列配列へのキャストが必要となる。
文字列がファイルのパスかどうかを確認するには、そのパスが示すものがファイルとして存在するかを確認すればよい。ここではFileクラス(System.IO名前空間)のExitsメソッドを使用しているが、これについては「TIPS:ファイルやディレクトリの存在を確認するには?」を参照してほしい。
DragDropイベント・ハンドラの記述
DragEnterイベントに続いては、マウスのボタンが離されたときにDragDropイベントが発生し、D&D操作が完了となる。
このイベント・ハンドラでは、D&Dされたデータ(=パスの配列)をフィールドに保存したり、各ファイルを開いたりする処理を記述する。次のコードでは、それをリストボックス(listBox1)に表示している。D&Dされたデータの内容の取得はリスト2とまったく同様に、GetDataメソッドにより行える。
| ||
| リスト3 DragDropイベント・ハンドラの記述例(上:C#、下:VB) | ||
| フォーム上にはListBoxコントロール(listbox1)が配置されているものとする。 |
DragDropイベントの前には必ずDragEnterイベントが処理されるので、GetDataメソッドにより得られる配列の内容は、DragEnterイベント・ハンドラとDragDropイベント・ハンドラで同じになるはずである。
最後に1つ注意点であるが、DragEnterイベント・ハンドラやDragDropイベント・ハンドラの処理中には、ドラッグ元となったエクスプローラは応答しなくなる(フリーズ状態となる)。このためイベント処理はできる限り軽くした方がよい。
DragDropイベント・ハンドラ内で時間のかかる処理を開始したい場合には、BackgroundWorkerコンポーネント(「TIPS:時間のかかる処理をバックグラウンドで実行するには?」を参照)や、スレッドを使用して行う必要がある。![]()
| 利用可能バージョン:.NET Framework 2.0のみ カテゴリ:Windowsフォーム 処理対象:フォーム 使用ライブラリ:DragEventArgsクラス(System.Windows.Forms名前空間) 使用ライブラリ:DragDropEffects列挙体(System.Windows.Forms名前空間) 関連TIPS:ファイルやディレクトリの存在を確認するには? 関連TIPS:時間のかかる処理をバックグラウンドで実行するには? |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


