【问题标题】:C# Drag & Drop Between ListViewsC# 在 ListView 之间拖放
【发布时间】:2010-11-01 22:07:10
【问题描述】:

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

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

我遇到的问题是从一个列表视图拖动到一个完全不同的列表视图。该事件按预期在另一个列表视图上触发,但该方法不采用“发送者”参数,因此没有很好的方法来判断项目是从哪里拖动的,我也无法弄清楚实际抓取被拖动的项目。当前代码适用于“this.SelectedItems”之类的内容,但我希望它是“sender.SelectedItems”。

我猜没有 sender 参数的原因是控件不应该负责了解其环境的太多信息,并且宿主 Form 应该处理两个控件之间的交互,但我正在尝试构建 self包含具有此功能的控件,因此让它渗入表单是行不通的。

想法?

【问题讨论】:

    标签: c# .net winforms listview


    【解决方案1】:

    我想你可以从 Items by 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;
        }
    }
    

    检查DragEventArgs,此示例在CodeProject [VB.Net] 祝你好运!

    【讨论】:

    • 这是个好主意,但请记住,如果从不同的 ListView 拖动项目,我不一定会拖动项目——我只能通过 this.SelectedItems 访问项目,如果“this " 不是该物品的来源,那么我认为我无法获得该物品。有意义吗?
    • 不,你可以,你可以通过 DragEventArgs 得到它,我会编辑我的答案并添加代码。
    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多