ListView 的 DragEnter、DragOver、DragDrop 事件未引发 (AllowDrop=True)

Posted

技术标签:

【中文标题】ListView 的 DragEnter、DragOver、DragDrop 事件未引发 (AllowDrop=True)【英文标题】:ListView's DragEnter, DragOver, DragDrop event not raised (AllowDrop=True) 【发布时间】:2010-10-08 02:49:29 【问题描述】:

这个很奇怪:

我的应用程序运行良好,但突然间,该死的 ListView 控件的事件不再引发。它只是来来去去,没有任何明确的理由。 (显然)我已将 AllowDrop 属性设置为 True,并按如下方式处理 DragEnter、DragOver 和 DragDrop 事件:

Private Sub lstApplications_DragDrop(ByVal sender As Object, ByVal e As    System.Windows.Forms.DragEventArgs) Handles lstApplications.DragDrop, Me.DragDrop
    m_fileNames = CType(e.Data.GetData(DataFormats.FileDrop), String())
    mnuType.Show(Cursor.Position, ToolStripDropDownDirection.BelowLeft)
End Sub

Private Sub lstApplications_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lstApplications.DragEnter, Me.DragEnter, lstApplications.DragOver, Me.DragOver
    If chkMode.Checked OrElse Not e.Data.GetDataPresent(DataFormats.FileDrop, True) Then
        e.Effect = DragDropEffects.None
    Else
        e.Effect = DragDropEffects.Copy
    End If
End Sub

我在这两种方法中编写的代码无关紧要,因为没有引发任何事件。 我在这里有什么遗漏吗?


我在另一台机器上运行相同的应用程序,它运行良好。然后我重新启动了自己的机器,一切又开始工作了。我不确定,但 Windows 似乎出了点问题。

【问题讨论】:

【参考方案1】:

我刚刚经历了几个小时的类似问题。拖放工作的三个强制性要求:

    确保您的目标 UI 元素具有 AllowDrop="True",您不需要整个应用程序,只需要启用的元素即可。 如果未设置背景,某些元素不会接收某些鼠标事件(包括 d&d)。 Background="Transparent" 可以。 以管理员权限运行任何程序都会导致拖放操作混乱。确保您在没有管理员权限的情况下启动 Visual Studio

【讨论】:

傻我!我忘记了 AllowDrop 属性。非常感谢。 管理部分是关键。想弄清楚我自己和同事如何运行相同的代码,但事件并没有为我触发(因为我以管理员身份运行)但它们是为他而发的。【参考方案2】:

我在 Windows 7 上运行 Visual Studio 2008 时遇到了这个问题。VS2008 必须在 Windows 7 上以管理员权限运行,所以我以不同的用户身份运行它。我很确定这可以防止拖放工作,因为应用程序在作为应用程序运行时运行良好,但是从 Visual Studio 运行时拖放将不起作用。

【讨论】:

奇怪的是,这就是导致我的问题的原因。我无法找到任何细节来说明为什么会发生这种情况。还是谢谢!【参考方案3】:

只是记得我们确实在很久以前见过这个。

我相信它是这样发生的:

拖放工作正常,直到某些用户代码在拖放操作期间引发异常。

异常会被吃掉;你不会得到任何错误对话框(你自己试试看)。在此之后,拖放将停止工作。

【讨论】:

即使我关闭应用程序并再次运行它也没有开始工作。我不认为这与抛出异常有关。但我不确定。【参考方案4】:

表单本身的 AllowDrop 属性是否设置为 true?

【讨论】:

是的。奇怪的是它工作了一段时间,但突然中断。 代码中某处的 AllowDrop 值是否会发生变化? 我查过了。属性值为 True 且完好无损。【参考方案5】:

如果您遇到间歇性行为,则可能是异常正在从您的处理程序中逃逸并且无意中断开拖放连接。尝试在代码周围添加一个全面的 Try/Catch 块,并在 Catch 块中执行 Debug.Fail。这至少可以排除未处理的异常是您的问题的可能性。

【讨论】:

【参考方案6】:

您的控件的创建可能会以某种方式被篡改。您确定句柄存在并且完整的初始化代码集已经运行吗?

我最近遇到了一个类似的问题,由于我犯了一个错误,Control.OnHandleCreated 没有运行,这导致了各种错误,包括你在此处描述的内容。

【讨论】:

+1 我刚刚纠正了一个具有相同症状的错误,即拖放停止工作。原来我已经覆盖了 OnHandleCreated 但未能调用基本实现。这也产生了奇怪的效果,即 DragEnter 事件改为转到父控件。【参考方案7】:

您是否尝试过删除方法处理程序存根,重新编译,然后将它们放回原处并再次编译?我知道这听起来很古怪,但有时我只需要重置我的工作副本。

【讨论】:

以上是关于ListView 的 DragEnter、DragOver、DragDrop 事件未引发 (AllowDrop=True)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIScrollView 上检测“Drag Enter”

jQuery dragenter 或 dragover 包含子项

HTML5拖放的dragover vs dragenter事件

如何在 Drag-Sort ListView 中刷新 ListView?

WPF实现Drag/Drop操作

原生 drag drop HTML5