- 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」が発生します。
実行結果
一応、実行結果。
|
|
終了。















