DragDrop事件没有在usercontrol内的对象上触发(但DragEnter会)

时间:2012-02-12 14:55:24

标签: asp.net vb.net events user-controls drag-and-drop

好的标题很好地描述了我的问题。以下是对我的问题的更详细描述:

我正在使用TabControl构建一个应用程序,我在执行时使用TabPages填充它。在我的第一个代码版本中,这些TabPages中填充了子ListView。 ListView也是在代码中创建的,使用AddHandlers将其链接到DragEnter和DragDrop例程。一切都很顺利......

现在我需要在每个TabPage上使用其他控件,而不是在代码中创建每个控件,我创建了一个包含ListView和一些按钮的UserControl,我为每个新的TabPage实例化。

现在的问题是不再引发DragDrop事件

  • DragEnter事件 - >好的
  • DragOver事件 - >好的
  • DragLeave事件 - >好的
  • DragDrop事件 - > 没有提出!!

这个问题让我发疯了:对于我可能遗失的任何想法?

我认为代码不会有任何帮助,但要回答第一条评论: 第一版:在代码中创建的控件(有效):

    Dim NewTab As New TabPage(TextBox1.Text)
    Dim NewListView As New ListView()
    Dim NewImageList As New ImageList()

    'Organise les nouveaux contrôles
    NewListView.Parent = NewTab
    NewListView.Dock = DockStyle.Fill
    NewListView.View = View.LargeIcon
    NewListView.LargeImageList = NewImageList
    NewListView.AllowDrop = True
    AddHandler NewListView.DoubleClick, AddressOf ListViewItem_DblClick
    AddHandler NewListView.DragEnter, AddressOf ListViewItem_DragEnter
    AddHandler NewListView.DragDrop, AddressOf ListViewItem_DragDrop
    TabControl1.TabPages.Add(NewTab)
    TabControl1.SelectTab(NewTab)
    NewImageList.ImageSize = New Size(100, 100)
    NewImageList.ColorDepth = ColorDepth.Depth24Bit

    TabControl1.Refresh()

第二版:Usercontrol(不起作用): 首先,假设用户控件TabAnnoncesContent包含AnnoncesListViewAnnoncesImageList

    Dim NewTab As New TabPage(TextBox1.Text)
    Dim NewTabContent As New TabAnnoncesContent()

    NewTabContent.Parent = NewTab
    NewTabContent.Dock = DockStyle.Fill

    TabControl1.TabPages.Add(NewTab)
    TabControl1.SelectTab(NewTab)

    TabControl1.Refresh()

然后在我的TabAnnoncesContent类代码中,我有:

Private Sub AnnoncesListView_DragDrop(sender As Object, e As System.Windows.Forms.DragEventArgs) Handles AnnoncesListView.DragDrop
    Dim selection As ListViewItem = sender.HitTest(sender.PointToClient(New Point(e.X, e.Y))).Item

    If (selection IsNot Nothing) Then
        MsgBox("D&D received -> " & e.Data.GetData(DataFormats.Text))
    End If
End Sub

Private Sub AnnoncesListView_DragEnter(sender As Object, e As System.Windows.Forms.DragEventArgs) Handles AnnoncesListView.DragEnter
    If (e.Data.GetDataPresent(DataFormats.Text)) Then
        ' Display the copy cursor.
        e.Effect = DragDropEffects.Link
    Else
        ' Display the no-drop cursor.
        e.Effect = DragDropEffects.None
    End If
End Sub

当我使用文本输入ListView时执行AnnonceListView_DragEnter例程,但是当我释放鼠标时,AnnonceListView_DragDrop事件永远不会被提升。

1 个答案:

答案 0 :(得分:1)

在代码中不使用Option Strict On是Visual Basic的便利。当您得到错误的代码时,您将收到运行时错误而不是编译错误。但是在拖放代码中,这并没有很好的效果,事件是通过一个可以吞下所有异常的后退来调用的。您将获得的唯一诊断是“输出”窗口中的第一次机会异常通知。当然很容易错过。

Anyhoo,Debug + Exceptions,Thrown复选框,让调试器停止异常。和Option Strict在源代码文件的顶部,以及早发现这些错误。然而,这确实需要不同的代码编写风格,更类似于C#。

顺便说一下,你还应该实现DragOver事件。因此,您可以调用ListView的HitTest()方法并检查用户是否实际上是将鼠标悬停在ListViewItem上。