簡體   English   中英

如何在同一ListView中拖放項目?

[英]How to drag & drop items in the same ListView?

在此處輸入圖片說明

考慮到這是一個顯示文件和文件夾的ListView,我已經編寫了復制/移動/重命名/顯示屬性... etc的代碼,我只需要再做一件事。 如何像在Windows資源管理器中一樣在相同的ListView中拖放,我具有移動和復制功能,我只需要獲取用戶放置在某個文件夾中的項目,或者以其他方式需要獲取這兩個參數來調用復制功能

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

首先將列表視圖的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屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM