【VisualStudio】【C#】ドラッグ&ドロップでファイル名を取得する 
2017/09/21 Thu [edit]
今回は前回使用したフォームアプリケーションのテキストボックスにドラッグ&ドロップでファイル名を取得できるようにしてみよう。これはコンボボックスやリストビューなどでも同じなので、一度書いておけば他のコントロールでもコピペで機能追加できる。
コントロールにドラッグ&ドロップを実装するには「Control.DragEnter」イベントと「Control.DragDrop」イベントを使う。またそれぞれのコントロールの「Control.AllowDropControl.AllowDrop」プロパティを true にしておく必要がある。それでは実際にやってみよう。
(※) Visual Studio 2017 / Windows10(x64) で確認
例えばコントロールに図のような名前が付いているとき、テキストボックスにエクスプローラからファイルをドラッグ&ドロップしたとき、ファイル名が自動で代入されるようにしてみよう。そのやり方とコードは以下のようになる。

●各コントロールごとにドラッグ&ドロップイベントを許可する
1.デザイン画面で「textBoxInput」をクリックしてプロパティウィンドウで「AllowDrop」を true にする。

2.プロパティウィンドウをイベントに切り替え(雷アイコンを押す)、「DragEnter」と「DragDrop」イベントが空欄ならダブルクリックでイベントハンドラを作成する。

3.ドラッグ開始(コントロール上に入った)のイベントハンドラ「textBoxInput_DragEnter()」にファイルの取得方法の指定を、ドロップのイベントハンドラ「textBoxInput_DragDrop()」にファイル名取得のコードを書く。
コードの例は以下を見て欲しい。
●ドラッグ&ドロップでファイル名を取得する
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void textBoxInput_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop)) //ファイルリストがあれば
{
e.Effect = DragDropEffects.Copy;
}
}
private void textBoxInput_DragDrop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); //ファイルリストを取得
foreach (string f in files)
{
textBoxInput.Text = f;
break; //はじめの1つのみ
}
}
}
}
ドロップのイベントハンドラ「textBoxInput_DragDrop()」ではファイルリストを foreach で回しているが、テキストボックスの場合1つで良いので break している。リストビューなどに使う場合はすべてのファイルをアイテムなどに追加していけば良い。
また、今回は簡略のため割愛するが「textBoxOuput」の方も同じようにやればドラッグ&ドロップが簡単に実装できる。コードもメソッドの中身をほぼまるごとコピーすれば良いので(※コントロール名のみ要修正)自分でやってみよう。
このコードに前回の「プロパティの保存」を加えれば、ドラッグ&ドロップでファイル指定、アプリ終了で前回の状態を保存すれば使い勝手の良いものになる。ファイル名取得の場合「参照」ボタンが付いているものも多いが、ドラッグ&ドロップもできればユーザビリティは更に高くなる。ぜひとも実装して欲しいものだ(笑)(ドラッグ&ドロップできないものは意外と多い)。
(関連記事)
【VisualStudio】【C#】OpenFileDialog(ファイルを開くダイアログ)でファイル名を取得する
【VisualStudio】【C#】設定の保存と読み込みをする
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/269-290558df
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |