2008-09-16 8 views
203

これは、ボーランドのTurbo C++環境で行われていますが、私が取り組んでいるC#アプリケーションでは、どうやってそれをどうやって進めるのか分かりません。注目すべきベストプラクティスや落とし穴はありますか?ファイルをアプリケーションにドラッグアンドドロップするにはどうすればよいですか?

+0

あなたがC#アプリケーションまたはC#IDEにドラッグ&ドロップを意味しますか? – JamesSugrue

+2

ソースのC#アプリケーション。彼は自分のアプリケーションをドラッグ&ドロップにしたいと思っています。 – SLA80

+3

[リンク](http://helgeklein.com/blog/2010/03/how-to-enable-drag-and-drop-for-an-elevated-mfc-application-on-vistawindows-7 /)。 –

答えて

37

Windowsフォームでは、コントロールのAllowDropプロパティを設定し、DragEnterイベントとDragDropイベントを待ち受けます。

DragEnterイベントが発生すると、引数のAllowedEffectをnone以外の値(例:e.Effect = DragDropEffects.Move)に設定します。

DragDropイベントが発生すると、文字列のリストが表示されます。各文字列は、ドロップされるファイルへのフルパスです。

16

あなたは怪我に気づく必要があります。ドラッグ/ドロップ操作でDataObjectとして渡すクラスは、すべて直列化可能でなければなりません。したがって、オブジェクトを試行して渡しても機能していない場合は、それがほぼ確実に問題になるため、シリアル化できることを確認してください。これは数回私を捕まえました!

6

もう1つのよくある問題は、フォームのDragOver(またはDragEnter)イベントを無視できると考えていることです。私は通常、フォームのDragOverイベントを使用してAllowedEffectを設定し、特定のコントロールのDragDropイベントを使用してドロップされたデータを処理します。

439

いくつかのサンプルコード:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     this.AllowDrop = true; 
     this.DragEnter += new DragEventHandler(Form1_DragEnter); 
     this.DragDrop += new DragEventHandler(Form1_DragDrop); 
    } 

    void Form1_DragEnter(object sender, DragEventArgs e) { 
     if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy; 
    } 

    void Form1_DragDrop(object sender, DragEventArgs e) { 
     string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); 
     foreach (string file in files) Console.WriteLine(file); 
    } 
    } 
+38

免責事項:Windows 7でVisual Studioを管理者として実行する場合、または管理者としてプログラムを実行する場合、デバッグでは機能しない可能性があります。 [ここ](http://stackoverflow.com/questions/2833709/c-sharp-drag-drop-does-not-work-on-windows-7) – Matthieu

+0

ファイルの内容はどうやって手に入りますか? – Burnsys

+3

@Burnsysドラッグ操作のファイルパスがある場合、 'io.File'を使用して読み取ることができます – Smith

10

さらに別の落とし穴:ドラッグイベントはすべての例外を飲み込む呼び出す

フレームワークコード。あなたのイベントコードはスムーズに動いていると思うかもしれませんが、どこにでも流出しています。フレームワークがそれらを盗むので、それらを見ることはできません。

私はこれらのイベントハンドラに常にtry/catchを入れているので、例外をスローするかどうかは分かります。私は通常、Debugger.Break();キャッチ部分に。

リリース前、テスト後、すべてが動作しているように見える場合は、これらを削除または実際の例外処理と置き換えます。

120

Windows Vista/Windows 7のセキュリティ権に注意してください - 管理者としてVisual Studioを実行している場合、Visual Studio内から実行すると、管理者以外のエクスプローラウィンドウからプログラムにファイルをドラッグできなくなります。ドラッグに関連するイベントは起動しません!私はこれが他の誰かの人生の時間を無駄にしないように助けてくれることを願っています...

+5

@Wayne Uroda:私のコードはうまくいかないと思っていました。このhttp://en.wikipedia.org/wiki/File:ProhibitionSign2.svgのような大きな "No symbol"を与えてくれました。それから私はこの答えを見て、非管理者としてVSを実行し、それが動作する前に!感謝万円。 –

+0

これについて十分にあなたに感謝することはできません、私はこのポストを見つけた場合を除き、私はあきらめてしまいました!それはあなたがそれを書いたときと同じように、2017年のWindows 10で有効です。 – Culme

3

ここで私はファイルやフォルダを完全にドロップしていました。私の場合は、*.dwgファイルのみをフィルタリングし、すべてのサブフォルダを含めることを選択しました。

fileList

var fileList = (IList)FileList.ItemsSource; 

は、そのトリックの詳細については https://stackoverflow.com/a/19954958/492を見る IEnumerableまたは私の場合は同様のWPFコントロールにバインドされました。

ドロップハンドラ...

private void FileList_OnDrop(object sender, DragEventArgs e) 
    { 
    var dropped = ((string[])e.Data.GetData(DataFormats.FileDrop)); 
    var files = dropped.ToList(); 

    if (!files.Any()) 
     return; 

    foreach (string drop in dropped) 
     if (Directory.Exists(drop)) 
     files.AddRange(Directory.GetFiles(drop, "*.dwg", SearchOption.AllDirectories)); 

    foreach (string file in files) 
    { 
     if (!fileList.Contains(file) && file.ToLower().EndsWith(".dwg")) 
     fileList.Add(file); 
    } 
    } 
0

ユダHimangoとハンスアンパッサンのソリューションは、(私は現在、VS2015を使用しています)Designerで提供されています: enter image description here enter image description here

関連する問題