C# Windows窗体拖放功能

C# Windows窗体拖放功能,c#,winforms,visual-studio-2015,drag-and-drop,C#,Winforms,Visual Studio 2015,Drag And Drop,我似乎具备了Drag-n-Drop工作所需的所有功能,但是当我尝试将某个控件拖动到另一个控件时,我的代码没有被调用 我创建了一个用于创建数据的测试类: class TestClass { public TestClass() { Name = "Blank"; Id = -1; } public String Name { get; set; } public int Id { get; set; } pu

我似乎具备了Drag-n-Drop工作所需的所有功能,但是当我尝试将某个控件拖动到另一个控件时,我的代码没有被调用

  • 我创建了一个用于创建数据的测试类:

    class TestClass
    {
    
        public TestClass()
        {
            Name = "Blank";
            Id = -1;
        }
    
        public String Name { get; set; }
    
        public int Id { get; set; }
    
        public object Data { get; set; }
    
        public override String ToString()
        {
            return String.Format("{0}: {1}", Id, Name);
        }
    
    }
    
  • 我创建了一个带有两个列表视图控件的空表单,
    listView1
    listView2

  • 我为所有拖放方法创建了事件处理程序,并在其上设置了断点:

    private void Form_DragDrop(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Copy;
        if (e.Data.GetDataPresent(typeof(TestClass)))
        {
            var item = e.Data.GetData(typeof(TestClass)) as TestClass;
            if (item != null)
            {
                // ?
            }
        }
    }
    
    private void Form_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Copy;
        if (sender.Equals(listView2))
        {
            e.Effect = DragDropEffects.All;
            if (e.Data != null)
            {
                var format = GetString(e);
                Console.WriteLine("{0} has a(n) {1} entering it.", listView2.Name, format);
            }
        }
    }
    
    private void Form_DragLeave(object sender, EventArgs e)
    {
        if (sender.Equals(listView2))
        {
    
        }
    }
    
    private void Form_DragOver(object sender, DragEventArgs e)
    {
        // Code Project Article 9017 says DragOver fires repeatedly, even if the mouse does not move.
        if ((e.X != _lastX) || (e.Y != _lastY))
        {
            _lastX = e.X;
            _lastY = e.Y;
            if (e.Data.GetDataPresent(typeof(TestClass)))
            {
    
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }
    }
    
    private void Form_GiveFeedback(Object sender, GiveFeedbackEventArgs e)
    {
        if (sender.Equals(listView2))
        {
            // ?
        }
    }
    
    private void Form_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
    {
        var listView = sender as ListView;
        if (listView != null)
        {
    
        }
    }
    
    private String GetString(DragEventArgs e)
    {
        var result = String.Empty;
        if ((e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy)
        {
            var formats = e.Data.GetFormats();
            foreach (var format in formats)
            {
                Console.WriteLine("Data is in the format of [{0}].", format);
                result = format;
            }
        }
        return result;
    }
    
  • 在构造函数的
    InitializeComponent()之后,我将两个控件连接起来

每当我运行项目时,所有内容都会正常加载,但从左侧拖动项目到右侧的任何尝试都不会产生任何效果。我的所有断点都没有命中。什么也没发生


我遗漏了什么?

您缺少一个方便的事件和启动拖动操作的方法:

listView1.ItemDrag += listView1_ItemDrag;

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

这是多么简单啊!谢谢
listView1.ItemDrag += listView1_ItemDrag;

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