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事件