C#Drag&;在列表视图之间拖放

C#Drag&;在列表视图之间拖放,c#,.net,winforms,listview,C#,.net,Winforms,Listview,我正在尝试创建一个名为DragDropListView的自包含Winforms控件。它源于ListView 我有一些代码,允许用户通过在新位置拖放列表项来对控件中的列表项进行排序。我通过覆盖OnDragDrop、OnDragOver、OnDragEnter和OnItemDrag实现了这一点 我遇到的问题是从一个listview拖动到一个完全不同的listview。该事件按预期在另一个列表视图上激发,但该方法不接受“sender”参数,因此没有很好的方法来判断项目从何处拖动,也没有办法实际抓取被拖

我正在尝试创建一个名为DragDropListView的自包含Winforms控件。它源于ListView

我有一些代码,允许用户通过在新位置拖放列表项来对控件中的列表项进行排序。我通过覆盖OnDragDrop、OnDragOver、OnDragEnter和OnItemDrag实现了这一点

我遇到的问题是从一个listview拖动到一个完全不同的listview。该事件按预期在另一个列表视图上激发,但该方法不接受“sender”参数,因此没有很好的方法来判断项目从何处拖动,也没有办法实际抓取被拖动的项目。当前代码可以处理“this.SelectedItems”之类的内容,但我希望它是“sender.SelectedItems”

我想没有发送方参数的原因是控件不应该负责了解它的环境,宿主窗体应该处理两个控件之间的交互,但我正在尝试构建具有此功能的自包含控件,所以让它流到表单上是行不通的


想法?

我想您可以通过
listViewItem从项目中了解
ListView
。ListView
属性,检查它

我没有测试代码:

private void listView1_DragEnter(object sender, DragEventArgs e)
{
    if (!e.Data.GetDataPresent(typeof(ListView.ListViewItemCollection)))
    {
        e.Effect = DragDropEffects.None;
        return;
    }

    var items = (ListView.ListViewItemCollection)e.Data.GetData(typeof(ListView.ListViewItemCollection));

    if (items.Count > 0 && items[0].ListView != listView1)
    {
        e.Effect = DragDropEffects.None;
        return;
    }
}
在[VB.Net]中检查此示例
祝你好运

我想您可以通过
listViewItem.ListView
属性从项目中了解
ListView

我没有测试代码:

private void listView1_DragEnter(object sender, DragEventArgs e)
{
    if (!e.Data.GetDataPresent(typeof(ListView.ListViewItemCollection)))
    {
        e.Effect = DragDropEffects.None;
        return;
    }

    var items = (ListView.ListViewItemCollection)e.Data.GetData(typeof(ListView.ListViewItemCollection));

    if (items.Count > 0 && items[0].ListView != listView1)
    {
        e.Effect = DragDropEffects.None;
        return;
    }
}
在[VB.Net]中检查此示例
祝你好运

这是一个很好的想法,但请记住,如果从不同的ListView拖动项目,则不一定要拖动该项目——我只能通过this.SelectedItems访问该项目,如果“this”不是该项目的源,则我认为无法获取该项目。有意义吗?不,你可以,你可以通过DragEventArgs获得它,我将编辑我的答案并添加代码。这是一个好主意,但请记住,如果从不同的列表视图拖动项目,我不一定要拖动项目——我只能通过此访问项目。SelectedItems,如果“this”不是项目的源,那我想我拿不到这个东西了。有意义吗?不,你可以,你可以通过DragEventArgs获得,我会编辑我的答案并添加代码。