Событие DragDrop не запускается на объекте внутри usercontrol (но DragEnter делает) - PullRequest
1 голос
/ 12 февраля 2012

Ну, название довольно хорошо описывает мою проблему. Вот чуть более подробное описание моей проблемы:

Я создаю приложение с помощью TabControl, которое я заполняю во время выполнения с помощью TabPages. В моей первой версии кода эти TabPages были заполнены дочерним ListView. ListView также был создан в коде, используя AddHandlers, чтобы связать его с процедурами DragEnter и DragDrop. Все работало очень хорошо ...

Теперь, когда мне нужны некоторые другие элементы управления на каждой вкладке TabPage, вместо того, чтобы создавать каждый отдельный элемент управления в коде, я создал UserControl, содержащий 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()

Вторая версия: 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

Процедуры AnnonceListView_DragEnter выполняются, когда я вхожу в ListView с текстом, но затем, когда я отпускаю мышь, событие AnnonceListView_DragDrop никогда не возникает.

1 Ответ

1 голос
/ 12 февраля 2012

Не использовать Option Strict On в вашем коде - удобство Visual Basic.Вы получите ошибки времени выполнения вместо ошибок компиляции, если вы ошиблись в коде.Это не очень хорошо работает в коде перетаскивания, хотя события вызываются с задним ходом, который поглощает все исключения.Единственная диагностика, которую вы получите, это уведомление об исключении при первом шансе в окне «Вывод».Очень легко пропустить, конечно.

Anyhoo, Debug + Exceptions, Thrown флажок, чтобы отладчик останавливался на исключении.И Option Strict On в верхней части вашего файла исходного кода для раннего обнаружения таких ошибок.Однако для этого требуется другой стиль написания кода, более похожий на C #.

Кстати, вам также следует реализовать событие DragOver.Таким образом, вы можете вызвать метод ListView HitTest () и проверить, что пользователь фактически наводит курсор на ListViewItem.

...