C# TextBox へのドラック アンド ドロップ(Drag&Drop)

  • デル株式会社
  • 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;
    

    MSヘルプ DragDropEffects Enum

    続いて、ドロップ時の処理。
    ここでは、ファイルパスを取得して、対象に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」が発生します。

    実行結果

    一応、実行結果。

    終了。

    関連記事

    ページ上部へ戻る