フォーム上からファイルを選択して取り込むのはちょっと面倒・・・
「CSVファイルなどをインポートしてDBに取り込む」といった処理はよくありますよね。その際にある手法として「ファイル選択ダイアログ」でファイルを指定する、というやり方があります。
ただ・・・
エクスプローラでファイルの場所開いてるし、そのままドラッグさせたい。
という要望はあるかと。
なのでドラッグで取り込みます。
Sponsored Linkドラッグ対象可能なコントロール
いろいろなコントロールが対象可能なようです。
基本的に「Drag関連イベント」が存在するコントロール、となるかと思います。例として・・・
- Form
- TextBox
- ListView
- TreeView など・・・
今回は「ListView」にドラッグしてみます。
Sponsored Linkサンプルソース
public FileDragSample()
{
InitializeComponent();
// コントロールへのドロップを許可する
listView1.AllowDrop = true;
// コントロールの「DragOver」「DragDrop」イベント
listView1.DragOver += ListView1_DragOver;
listView1.DragDrop += ListView1_DragDrop;
}
/// <summary>
/// コントロール上のドラッグ
/// </summary>
private void ListView1_DragOver(object sender, DragEventArgs e)
{
// ドラッグされているファイルパスを取得
// → 複数選択してドラッグされる場合もあるので配列
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
if (files.Length == 0)
return;
// 1ファイル限定の場合。
// 複数の場合は配列のファイルパスをすべてチェックして確認など
string filepath = files[0];
// --- 例として「拡張子」を判定。
if (System.IO.Path.GetExtension(filepath).ToLower() == ".csv")
{
// 対象ファイルであればドラッグ可能な状態とする
e.Effect = DragDropEffects.Move;
}
else
{
// 対象外のファイルであればドラッグは無効とする
e.Effect = DragDropEffects.None;
}
}
/// <summary>
/// ドロップされた後の処理。
/// </summary>
private void ListView1_DragDrop(object sender, DragEventArgs e)
{
// --- メッセージダイアログの表示、CSVファイルの読み込み 等の処理を行う。
}
DragDropEffects.Moveをセットすることでマウスカーソルの形状が変わります。
ほかのコントロールも基本的にやり方は同じです。