2012-02-25 38 views
2

enter image description here同じListView内の項目をドラッグアンドドロップする方法は?

これは、ファイルとフォルダを表示リストビューで考えてみましょう、私はすでにコピー/移動/名前変更/ショープロパティのコード...などを書いていると私はちょうど1より多くの最後のものを必要としています。 Windowsエクスプローラのように同じListViewにドラッグアンドドロップする方法は、私は移動とコピーの機能を持っています、そして、私はちょうどいくつかのフォルダや他の方法でドロップする項目を取得する必要があるコピー function

void copy(ListViewItem [] droppedItems, string destination path) 
{ 
// Copy target to destination 
} 
+0

Windowsのドラッグアンドドロップ操作は、DragEnter、DragLeave、およびDragDropの3つの単純なイベントを使用して実行できます。正確な情報については、** ** [Link](http://www.c-sharpcorner.com/UploadFile/skulkarni/ImlementingDragandDropinListViewControls11252005035642AM/ImlementingDragandDropinListViewContConts.aspx)**を参照してください.... –

答えて

4

まず、リストビューのAllowDropプロパティをtrueに設定します。ドラッグの開始を検出するためにItemDragイベントを実装します。私はD + Dのみ、コントロールの内部で動作することを確認するためにプライベート変数を使用します:

bool privateDrag; 

    private void listView1_ItemDrag(object sender, ItemDragEventArgs e) { 
     privateDrag = true; 
     DoDragDrop(e.Item, DragDropEffects.Copy); 
     privateDrag = false; 
    } 

次のあなたはそれがすぐに起動します、DragEnterイベントをする必要があります:

private void listView1_DragEnter(object sender, DragEventArgs e) { 
     if (privateDrag) e.Effect = e.AllowedEffect; 
    } 

次のあなたユーザーがドロップできるアイテムを選択したいと思うでしょう。そのためには、DragOverイベントが必要で、どのアイテムがホバリングされているかを確認する必要があります。通常の「ファイル」アイテムとフォルダを表すアイテムを区別する必要があります。 ListViewItem.Tagプロパティを使用して、これを行うことができます。たとえば、フォルダのパスに設定することができます。このコードの動作を作る:

private void listView1_DragOver(object sender, DragEventArgs e) { 
     var pos = listView1.PointToClient(new Point(e.X, e.Y)); 
     var hit = listView1.HitTest(pos); 
     if (hit.Item != null && hit.Item.Tag != null) { 
      var dragItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); 
      copy(dragItem, (string)hit.Item.Tag); 
     } 
    } 

あなたが複数のアイテムをドラッグサポートしたい場合は、あなたのドラッグがListView.SelectedIndicesプロパティをオブジェクト作ります。

+0

ummありがとうございます。 ? –

+0

DragOverイベントでそれを選択してみませんか? –

+0

DragOverイベントは表示エフェクト用で、実際にアイテムをドロップするにはDragDropイベントの処理が必要です。 – i486

関連する問題