2010-05-20 39 views
5

如何從Winforms-listview控件拖出一個項目到另一個控件(垃圾桶圖片)?C# - 將項目從列表視圖拖放到垃圾桶中?

UPDATE1:

我認爲的基本流程是:

  • 對列表視圖的ItemDrag事件有一個的DoDragDrop
  • 然後對捕獲即拖即在PictureBox dragEnter事件?

UPDATE2:

的基本流程(基於答案):

  • 添加 'ItemDrag' 事件列表視圖。
  • 在'ItemDrag'內添加'DoDragDrop'
  • 將'DragEnter'事件添加到圖片框。
  • 加上「GetDataPresent」檢查「dragEnter事件」內,以檢查所述數據類型
  • 一個「的DragDrop」事件添加到PictureBox的
  • 添加「dragEnter事件」來檢查在裏面「GetDataPresent」檢查數據類型

回答

14

實現列表視圖的ItemDrag事件的事件處理程序:

private void listView1_ItemDrag(object sender, ItemDragEventArgs e) { 
     DoDragDrop(e.Item, DragDropEffects.Move); 
    } 

而寫的垃圾桶事件處理程序:

private void trashCan_DragEnter(object sender, DragEventArgs e) { 
     if (e.Data.GetDataPresent(typeof(ListViewItem))) { 
      e.Effect = DragDropEffects.Move; 
     } 
     // others... 
    } 

    private void trashCan_DragDrop(object sender, DragEventArgs e) { 
     if (e.Data.GetDataPresent(typeof(ListViewItem))) { 
      var item = e.Data.GetData(typeof(ListViewItem)) as ListViewItem; 
      item.ListView.Items.Remove(item); 
     } 
     // others... 
    } 

你必須給力的圖片框AllowDrop屬性,它是不具備的屬性窗口:

public Form1() { 
     InitializeComponent(); 
     trashCan.AllowDrop = true; 
    } 
+0

謝謝@Hans!這些樣本確實幫助我找到了正確的道路 – 2010-05-20 17:27:39

2

編輯這僅適用,如果你想外殼集成拖和下降。如果您沒有與shell進行集成,只能在自己的應用程序中拖放各種東西,那麼此答案不適用。我對這種混亂表示歉意。


你需要支持拖放正滴在你的應用程序或控制。這涉及到一些COM互操作。

起初看起來有些複雜,但是一旦你獲得了基本的構架,就不難實現。也有一個很好的指南就在這裏,它告訴你如何:

http://blogs.msdn.com/adamroot/pages/shell-style-drag-and-drop-in-net-wpf-and-winforms.aspx

+3

應用程序中不應該有COM互操作,以支持應用程序中的拖放操作,AFAIK(注意*「到另一個控件(垃圾桶圖片)」*。 – 2010-05-20 17:17:41

+0

Wow @Cheeso - 看起來很複雜 - 以後可能會用到更高級的視覺效果 – 2010-05-20 17:28:32

+0

Ahh,Fredrik,你是對的!!我錯誤地解釋了這個問題,COM互操作只在執行shell集成的Drag/Drop時是必需的。 – Cheeso 2010-05-20 17:32:57