これがBorlandのTurbo C ++環境で行われるのを見てきましたが、現在取り組んでいるC#アプリケーションでどのように対処すればよいかわかりません。注意すべきベストプラクティスや落とし穴はありますか?
これがBorlandのTurbo C ++環境で行われるのを見てきましたが、現在取り組んでいるC#アプリケーションでどのように対処すればよいかわかりません。注意すべきベストプラクティスや落とし穴はありますか?
回答:
いくつかのサンプルコード:
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);
}
}
io.File
(string[])
キャストはFileDrop
フォーマットされたドロップに対して安全ですか?つまりFileDrop
、不正なキャスト例外を引き起こすを生成することは可能string[]
ですか?私はドキュメントからそれを理解するのに苦労しています。
Windows Vista / Windows 7のセキュリティ権限に注意してください。VisualStudioを管理者として実行している場合、Visual Studio内から実行すると、管理者以外のエクスプローラーウィンドウからプログラムにファイルをドラッグできません。ドラッグ関連のイベントは発生しません!これが他の誰かの人生の時間を無駄にしないのに役立つことを願っています...
Windowsフォームで、コントロールのAllowDropプロパティを設定し、DragEnterイベントとDragDropイベントをリッスンします。
DragEnter
イベントが発生したとき、引数をAllowedEffect
none以外に設定します(例:e.Effect = DragDropEffects.Move
。
ときにDragDrop
イベントが発生させ、あなたは文字列のリストを取得します。各文字列は、ドロップされるファイルへのフルパスです。
あなたは落とし穴を認識する必要があります。ドラッグアンドドロップ操作でDataObjectとして渡すクラスはすべて、シリアル化可能である必要があります。そのため、オブジェクトを渡してみても機能しない場合は、シリアル化できることを確認してください。これがほぼ間違いなく問題です。これは私を数回引っ張り出しました!
これは、ファイルやファイルでいっぱいのフォルダをドロップするために使用したものです。私の場合、*.dwg
ファイルのみをフィルタリングしていて、すべてのサブフォルダーを含めることを選択しました。
fileList
であるIEnumerable
か、私の場合には同様のWPFコントロールにバインドされたが...
var fileList = (IList)FileList.ItemsSource;
https://stackoverflow.com/a/19954958/492を参照してくださいそのトリックの詳細については、を。
ドロップハンドラー...
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);
}
}
WinFormsとWPFにドラッグ&ドロップを実装できます。
あなたはmousemoveイベントを追加する必要があります:
private void YourElementControl_MouseMove(object sender, MouseEventArgs e)
{
...
if (e.Button == MouseButtons.Left)
{
DoDragDrop(new DataObject(DataFormats.FileDrop, new string[] { PathToFirstFile,PathToTheNextOne }), DragDropEffects.Move);
}
...
}
DragDropイベントを追加する必要があります。
プライベートvoid YourElementControl_DragDrop(オブジェクト送信者、DragEventArgs e)
{
...
foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
{
File.Copy(path, DirPath + Path.GetFileName(path));
}
...
}