2010-05-20 40 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