public System.Windows.Forms.DragDropEffects DoDragDrop ( object data, System.Windows.Forms.DragDropEffects allowedEffects );Control.DoDragDrop(Object, DragDropEffects) Method (System.Windows.Forms) | Microsoft Learn
ドロップされた側が処理を完了するまで、このメソッドへは処理は戻りません。
ドロップのイベントを受け取るには、AllowDropプロパティをtrueにします。
ドラッグのイベント ハンドラが処理を返すまでドラッグされた側は処理を続行できないため、即座に処理を完了させます。
Ctrlキーなどの状態によってドラッグの処理を切り替えるならば、DragOverイベントで処理します。DragEnterは領域内へ入ったときにしか発生しないため、領域内でキーの状態が変更されても、それに応じた処理ができません。
protected override void OnDragEnter(DragEventArgs drgevent) { base.OnDragEnter(drgevent); if (drgevent.Data.GetDataPresent(DataFormats.FileDrop) || drgevent.Data.GetDataPresent(DataFormats.UnicodeText)) { drgevent.Effect = DragDropEffects.Copy; } else { drgevent.Effect = DragDropEffects.None; } } protected override void OnDragDrop(DragEventArgs drgevent) { base.OnDragDrop(drgevent); if (drgevent.Data.GetDataPresent(DataFormats.FileDrop)) { string[] files = (string[])drgevent.Data.GetData(DataFormats.FileDrop); } else if (drgevent.Data.GetDataPresent(DataFormats.UnicodeText)) { string text = (string)drgevent.Data.GetData(DataFormats.UnicodeText); } BeginInvoke((MethodInvoker)delegate { // 時間のかかる処理は非同期で実行する }); }
protected override void OnDragOver(DragEventArgs drgevent)
{
base.OnDragOver(drgevent);
if (drgevent.Data.GetDataPresent(DataFormats.Text))
{
if ((drgevent.KeyState & 0x08) != 0 // Ctrl key
&& (drgevent.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy)
{
drgevent.Effect = DragDropEffects.Copy;
}
else if ((drgevent.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
{
drgevent.Effect = DragDropEffects.Move;
}
else
{
drgevent.Effect = DragDropEffects.None;
}
}
}
コントロール上をファイルがドラッグされたときに、そのファイルのアイコンを表示するには、COMのDrag-and-Drop Helper Objectを利用します。