C#拖动;删除列表视图之间

时间:2010-11-01 22:07:11

标签: c# .net winforms listview

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

我的代码允许用户通过拖放新位置中的项目来对控件中的列表项进行排序。我通过重写OnDragDrop,OnDragOver,OnDragEnter,OnItemDrag实现了这一点。

我遇到的问题是从一个列表视图拖动到一个完全不同的列表视图。该事件按预期在另一个列表视图上触发,但该方法不采用“发送者”参数,因此没有好的方法来判断项目的拖动位置,也无法确定实际抓住被拖动的物品。当前代码使用“this.SelectedItems”之类的东西,但我希望它是“sender.SelectedItems”。

我认为没有发送者参数的原因是控件不应该负责了解其环境,并且主机Form应该处理两个控件之间的交互,但我正在尝试构建自己包含具有此功能的控件,因此让它流失到表单上是行不通的。

想法?

1 个答案:

答案 0 :(得分:1)

我认为你可以通过ListView属性知道listViewItem.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;
    }
}

DragEventArgs [VB.Net]中查看此示例CodeProject 祝你好运!