VB.NETでエクスプローラからファイルをドラッグ&ドロップで設定する方法について説明する。
ドラッグ&ドロップに対応するには、対象フォームで以下の設定を行う。
1.AllowDropプロパティをTrueにする
2.DragEnterイベントを作成する
3.DragDropイベントを作成する
1.AllowDropプロパティ
このプロパティをTrueにすると、フォームに対するドラッグ&ドロップが有効になる。
(Falseでは、ドラッグ&ドロップは無効)
2.DragEnterイベント
ドラッグ中のマウスカーソルがフォームに入った時に発生するイベント。
このタイミングで、ドラッグ中のデータがファイルであることを確認し、処理を振り分ける。
3.DragDropイベント
マウスのボタンが離された時に発生するイベント。
このタイミングでドラッグ&ドロップ操作が完了となる。
以下、サンプル。
ドラッグ&ドロップに対応するには、対象フォームで以下の設定を行う。
1.AllowDropプロパティをTrueにする
2.DragEnterイベントを作成する
3.DragDropイベントを作成する
1.AllowDropプロパティ
このプロパティをTrueにすると、フォームに対するドラッグ&ドロップが有効になる。
(Falseでは、ドラッグ&ドロップは無効)
2.DragEnterイベント
ドラッグ中のマウスカーソルがフォームに入った時に発生するイベント。
このタイミングで、ドラッグ中のデータがファイルであることを確認し、処理を振り分ける。
3.DragDropイベント
マウスのボタンが離された時に発生するイベント。
このタイミングでドラッグ&ドロップ操作が完了となる。
以下、サンプル。
【事前準備】
・Form1を作成する。
・Form1のAllowDropプロパティをTrueに設定する。
Form1のイベントとして、以下を記述する。
'ドラッグ&ドロップで入力したファイルのパスをリッチテキストに表示する。
Public Class Form1
'ドラッグ中のオブジェクトがファイルであるか確認する
Private Sub Form1_DragEnter(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.DragEventArgs) _
Handles MyBase.DragEnter
'データ形式の確認
If e.Data.GetDataPresent(DataFormats.FileDrop) = False Then
Return
End If
'ドラッグしているファイル/フォルダの取得
Dim FilePath() As String = _
CType(e.Data.GetData(DataFormats.FileDrop), String())
For idx As Integer = 0 To FilePath.Length - 1
If Not System.IO.File.Exists(FilePath(idx)) Then
Return
End If
Next idx
'ドロップ可能な場合は、エフェクトを変える
e.Effect = DragDropEffects.Copy
End Sub
'ファイルパスを設定する
Private Sub Form1_DragDrop(ByVal sender As Object, _
ByVal e As DragEventArgs) Handles MyBase.DragDrop
'ドラッグしているファイル/フォルダの取得
Dim FilePath() As String = _
CType(e.Data.GetData(DataFormats.FileDrop), String())
ファイルパスをリッチテキスト(FilePathRichText)に表示する
FilePathRichText.Clear()
For idx As Integer = 0 To FilePath.Length - 1
FilePathRichText.AppendText(FilePath(idx) & _
System.Environment.NewLine)
Next idx
End Sub
End Class
これで、アプリケーションに対して、エクスプローラからファイルをドラッグ&ドロップすることができるようになる。
【補足事項】
・ファイル以外にも識別可能な形式(BitMap、テキスト等)がある。
・e.Data.GetDataPresent()メソッドでデータ形式(ファイルかどうか)を確認する。
・e.Data.GetData()は、内容を取得する場合に利用する。
→DataFormats.FileDropを引数に指定した場合、戻り値の型は、String配列となる。
(ファイルパス(文字列)を返すが、複数選択可能なので、String配列となる)
DataFormats.FileDrop以外を指定した場合、戻り値の型は、Object型となる。
・以下の処理では、ファイルとフォルダ(ディレクトリ)のパスを取得する。
Dim FilePath() As String = _
CType(e.Data.GetData(DataFormats.FileDrop), String())
・ファイルのみを有効としたい場合には、以下の処理が必要となる。
If Not System.IO.File.Exists(FilePath(idx)) Then
'ファイルが存在しないので、ディレクトリとして認識する
End If
・フォルダ(ディレクトリ)のみ有効としたい場合には、以下の処理が必要となる。
If Not System.IO.Directory.Exists(FilePath(idx)) Then
'フォルダが存在しないので、ファイルとして認識する
End
・フォーム上に配置したコントロール上では、ドラッグ&ドロップは機能しない。
→Dockプロパティを設定している場合、ドラッグ&ドロップできる範囲に注意!
・入力支援の一つとして考えること!
→入力手段として強制することは避けること!
必ず、ファイルダイアログの表示等の入力方法を実装しておくこと!
・Form1を作成する。
・Form1のAllowDropプロパティをTrueに設定する。
Form1のイベントとして、以下を記述する。
'ドラッグ&ドロップで入力したファイルのパスをリッチテキストに表示する。
Public Class Form1
'ドラッグ中のオブジェクトがファイルであるか確認する
Private Sub Form1_DragEnter(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.DragEventArgs) _
Handles MyBase.DragEnter
'データ形式の確認
If e.Data.GetDataPresent(DataFormats.FileDrop) = False Then
Return
End If
'ドラッグしているファイル/フォルダの取得
Dim FilePath() As String = _
CType(e.Data.GetData(DataFormats.FileDrop), String())
For idx As Integer = 0 To FilePath.Length - 1
If Not System.IO.File.Exists(FilePath(idx)) Then
Return
End If
Next idx
'ドロップ可能な場合は、エフェクトを変える
e.Effect = DragDropEffects.Copy
End Sub
'ファイルパスを設定する
Private Sub Form1_DragDrop(ByVal sender As Object, _
ByVal e As DragEventArgs) Handles MyBase.DragDrop
'ドラッグしているファイル/フォルダの取得
Dim FilePath() As String = _
CType(e.Data.GetData(DataFormats.FileDrop), String())
ファイルパスをリッチテキスト(FilePathRichText)に表示する
FilePathRichText.Clear()
For idx As Integer = 0 To FilePath.Length - 1
FilePathRichText.AppendText(FilePath(idx) & _
System.Environment.NewLine)
Next idx
End Sub
End Class
これで、アプリケーションに対して、エクスプローラからファイルをドラッグ&ドロップすることができるようになる。
【補足事項】
・ファイル以外にも識別可能な形式(BitMap、テキスト等)がある。
・e.Data.GetDataPresent()メソッドでデータ形式(ファイルかどうか)を確認する。
・e.Data.GetData()は、内容を取得する場合に利用する。
→DataFormats.FileDropを引数に指定した場合、戻り値の型は、String配列となる。
(ファイルパス(文字列)を返すが、複数選択可能なので、String配列となる)
DataFormats.FileDrop以外を指定した場合、戻り値の型は、Object型となる。
・以下の処理では、ファイルとフォルダ(ディレクトリ)のパスを取得する。
Dim FilePath() As String = _
CType(e.Data.GetData(DataFormats.FileDrop), String())
・ファイルのみを有効としたい場合には、以下の処理が必要となる。
If Not System.IO.File.Exists(FilePath(idx)) Then
'ファイルが存在しないので、ディレクトリとして認識する
End If
・フォルダ(ディレクトリ)のみ有効としたい場合には、以下の処理が必要となる。
If Not System.IO.Directory.Exists(FilePath(idx)) Then
'フォルダが存在しないので、ファイルとして認識する
End
・フォーム上に配置したコントロール上では、ドラッグ&ドロップは機能しない。
→Dockプロパティを設定している場合、ドラッグ&ドロップできる範囲に注意!
・入力支援の一つとして考えること!
→入力手段として強制することは避けること!
必ず、ファイルダイアログの表示等の入力方法を実装しておくこと!
- カテゴリ:
- VB.NET
ありがとうございました。