2012-02-25 70 views
2

enter image description here如何在同一個ListView中拖放項目?

考慮,這是一個ListView顯示文件和文件夾,我已經寫了代碼複製/移動/重命名/顯示性能...等,我只需要最後一兩件事。如何在Windows資源管理器中拖放相同的ListView中,我有移動和複製功能,我只需要獲取用戶在某個文件夾中刪除的項目或以其他方式獲取這兩個參數以調用copy函數

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

使用3個簡單事件 - DragEnter,DragLeave和DragDrop可以實現Windows中的拖放操作。請參閱此** [鏈接](http://www.c-sharpcorner.com/UploadFile/skulkarni/ImlementingDragandDropinListViewControls11252005035642AM/ImlementingDragandDropinListViewControls.aspx)**準確的信息.... – 2012-02-25 11:55:09

回答

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屬性。例如,您可以將其設置爲文件夾的路徑。如果你想支持拖動多個項目,然後進行拖動對象的ListView.SelectedIndices財產

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); 
     } 
    } 

:使此代碼工作。

+0

ummm謝謝,但什麼突出項目之前下降? – 2012-02-25 16:44:57

+0

你爲什麼不直接在DragOver事件中選擇它? – 2012-02-25 16:52:22

+0

我認爲DragOver事件是用於顯示效果的,並且必須處理DragDrop事件才能實際刪除該項目。 – i486 2014-11-05 09:07:51