具有列表视图、拖放的 Windows 窗体需要源列表视图

本文关键字:列表 视图 窗体 Windows 拖放 | 更新日期: 2023-09-27 18:31:29

使用 VS 2008,我有一个包含 2 个 ListView 的窗口窗体(我们称它们为 ListView1 和 ListView2)。 ListView1 填充了目录中的文件名。 当一个项目从列表视图 1 拖动到 ListView2 时,我有一些代码被执行。 当我将拖放从列表视图 2 拖到 ListView1 时,会执行一些代码。 我想做的是,如果您从 ListView2 拖放到自身上,则不执行代码

下面是在删除后调用的 dragDrop 方法:

private void view_DragDrop(object dropTarget, DragEventArgs e)

我尝试了一些项目,例如:

ListView data = (ListView)e.Data.GetData("System.Windows.Forms.ListView")

这返回 null 我想对上面的内容做的是查看数据是否 = dropTarget,不执行。

具有列表视图、拖放的 Windows 窗体需要源列表视图

您可以使用 OriginalSource 属性验证事件的来源并确保目标不同。

所以在你的ListView2 DragDrop活动中,我会做这样的事情:

private void view_DragDrop(object dropTarget, DragEventArgs e)
{
    if (e.OriginalSource == ListView2)
       return;
    //Rest of the code here
}

这将防止任何从ListView2中拖动的项目触发ListView2中的代码执行。

MSDN 上的 DragEventArgs 类

表单范围内创建一个变量

object dfrom;
//your methods ect
    private void view_ItemDrag(Object sender, System.Windows.Forms.ItemDragEventArgs e)
    //your code to drag items
    dfrom = sender
}
private void view_DragDrop(object dropTarget, System.Windows.Forms.DragEventArgs e)
{
    if (dfrom == sender){return;}//this will protect both list boxes (assuming you can drag from both).
    //Your code
}