ファイルをドラッグしてシステムに取り込みたい

Sponsored Link

フォーム上からファイルを選択して取り込むのはちょっと面倒・・・

「CSVファイルなどをインポートしてDBに取り込む」といった処理はよくありますよね。その際にある手法として「ファイル選択ダイアログ」でファイルを指定する、というやり方があります。

ただ・・・

エクスプローラでファイルの場所開いてるし、そのままドラッグさせたい。

という要望はあるかと。

なのでドラッグで取り込みます。

Sponsored Link

ドラッグ対象可能なコントロール

いろいろなコントロールが対象可能なようです。

基本的に「Drag関連イベント」が存在するコントロール、となるかと思います。例として・・・

  1. Form
  2. TextBox
  3. ListView
  4. 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をセットすることでマウスカーソルの形状が変わります。

ほかのコントロールも基本的にやり方は同じです。

タイトルとURLをコピーしました