- 2019-1-3
- Visual C#
C#のDrag&Dropの方法
今更なんだが、Drag&Drop。
TextBoxへファイルパスをDrag&Dropで設定する。
プロパティの設定
TextBoxのプロパティで、「AllowDrop」を「True」へ変更する。
イベントメソッドの作成
続いて、「DragDrop」と「DragEnter」のイベントを作成する。
それぞれ、メソッド名を入力して[Enter]ボタン押下。
メソッドが作成される。
※先にソース書いといて、後でそれぞれのメソッドへ設定してもよい。
こんな感じになる。はず。
private void Text_DragEnter(object sender, DragEventArgs e) { } private void Text_Drop(object sender, DragEventArgs e) { }
ソースの修正
今回は、ファイルパスを設定するので、ソースそれぞれに下記の修正を加える。
/// <summary> /// ドラック時のカーソル変更 /// </summary> private void Text_DragEnter(object sender, DragEventArgs e) { // ドラッグ中のファイルやディレクトリの取得 string[] sFileName = (string[])e.Data.GetData(DataFormats.FileDrop); //ファイルがドラッグされている場合、 if (e.Data.GetDataPresent(DataFormats.FileDrop)) { // 配列分ループ foreach (string sTemp in sFileName) { // ファイルパスかチェック if (File.Exists(sTemp) == false ) { // ファイルパス以外なので何もしない return; } else { break; } } // カーソルを[+]へ変更する // ここでEffectを変更しないと、以降のイベント(Drop)は発生しない e.Effect = DragDropEffects.Copy; } }
ここで重要なのは、下記の部分で、「e.Effect」の値を適切に変更しないと、
以降のイベント(Drop)は発生しないので注意が必要。
e.Effect = DragDropEffects.Copy;
続いて、ドロップ時の処理。
ここでは、ファイルパスを取得して、対象にTextBoxに設定する。
/// <summary> /// ドロップ時イベント /// </summary> private void Text_Drop(object sender, DragEventArgs e) { //ドロップされたファイルの一覧を取得 string[] sFileName = (string[])e.Data.GetData(DataFormats.FileDrop, false); if (sFileName.Length <= 0) { return; } // ドロップ先がTextBoxであるかチェック TextBox TargetTextBox = sender as TextBox; if (TargetTextBox == null) { // TextBox以外のためイベントを何もせずイベントを抜ける。 return; } // 現状のTextBox内のデータを削除 TargetTextBox.Text = ""; // TextBoxドラックされた文字列を設定 TargetTextBox.Text = sFileName[0]; // 配列の先頭文字列を設定 }
補足すると、
「TextBox TargetTextBox = sender as TextBox;」
は、「sender」が対象オブジェクトそのものなので、(今回の場合、対象のTextBox)
as演算子を使用して、TextBoxオブジェクトへ変換しています。
※同じ挙動のTextBoxならイベント使い回せる(プロパティに同じメソッドを設定する)
下記のようにキャストでも同じ動作を行えますが、
キャストとas演算子は、違いがあるので注意が必要です。
「TextBox TargetTextBox = (TextBox)sender;」
as演算子とキャストの違い(補足の補足)
as演算子とキャストの違いは、変換できないときの挙動に違いにあります。
【as演算子】
変換できない場合、「null」を返却します。
【キャスト】
例外「InvalidCastException」が発生します。
実行結果
一応、実行結果。
終了。