2012-02-12 90 views
1

那么标题很好地描述了我的问题。这里是我的问题一点点更详细的描述:DragDrop事件不在用户控件内的对象上触发(但DragEnter确实)

我正在建立一个TabControl的应用程序,我在执行时用TabPages填充。在我的代码的第一个版本中,这些TabPages填充了一个子ListView。 ListView也是在代码中创建的,使用AddHandlers将其链接到DragEnter和DragDrop例程。一切工作非常好...

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

现在的问题是,DragDrop事件不再被提出

  • DragEnter事件 - >引发OK
  • DragOver事件 - >引发OK
  • DragLeave事件 - >引发OK
  • 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() 

第二个版本:用户控件(不工作): 首先,设想一个用户控件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类代码我:当我进入的ListView文本

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 

AnnonceListView_DragEnter程序执行,但后来当我松开鼠标,该AnnonceListView_DragDrop事件从未提出。

+0

诊断“不起作用!”是不可能的像这样的问题。发布代码片段。 – 2012-02-12 15:05:43

+0

我已经按要求添加了代码,但我非常怀疑它会提供任何帮助(标准拖放代码)。我期待着更多像AllowDrop属性需要被设置为True,并在那里或其他东西... – Federico 2012-02-12 15:20:09

+0

在输出窗口中查找“第一次机会异常”通知。调试+异常,勾选抛出框为CLR异常,使调试器停止。 HitTest代码将会抛出它们。 – 2012-02-12 15:48:03

回答

1

不在代码中使用Option Strict On是Visual Basic的一种便利。当你弄错代码时,你会得到运行时错误而不是编译错误。尽管在拖放代码中这样做效果不佳,但事件是通过一个后退停止来调用的,这会导致所有异常。您将得到的唯一诊断信息是“输出”窗口中的第一次机会异常通知。当然很容易错过。

Anyhoo,Debug + Exceptions,Thrown复选框让调试器停止异常。并且在您的源代码文件的顶部选择Strict On以尽早发现这些错误。然而,这需要不同的代码书写风格,更类似于C#。

顺便说一下,你也应该实现DragOver事件。所以你可以调用ListView的HitTest()方法并检查用户是否真的在一个ListViewItem上徘徊。

相关问题