好的标题很好地描述了我的问题。以下是对我的问题的更详细描述:
我正在使用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
包含AnnoncesListView
和AnnoncesImageList
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
事件永远不会被提升。
答案 0 :(得分:1)
在代码中不使用Option Strict On是Visual Basic的便利。当您得到错误的代码时,您将收到运行时错误而不是编译错误。但是在拖放代码中,这并没有很好的效果,事件是通过一个可以吞下所有异常的后退来调用的。您将获得的唯一诊断是“输出”窗口中的第一次机会异常通知。当然很容易错过。
Anyhoo,Debug + Exceptions,Thrown复选框,让调试器停止异常。和Option Strict在源代码文件的顶部,以及早发现这些错误。然而,这确实需要不同的代码编写风格,更类似于C#。
顺便说一下,你还应该实现DragOver事件。因此,您可以调用ListView的HitTest()方法并检查用户是否实际上是将鼠标悬停在ListViewItem上。