2012-02-12 1 views
1

Ну, название довольно хорошо описывает мою проблему. Вот немного более подробное описание моей проблемы:Событие DragDrop не запускается на объекте внутри usercontrol (но DragEnter делает)

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

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

+0

Невозможно диагностировать «это не работает!» такие вопросы. Отправьте фрагмент кода. –

+0

Я добавил код в соответствии с запросом, но я очень сомневаюсь, что это будет любая помощь (стандартный код перетаскивания). Я ожидал чего-то большего, чем свойство AllowDrop должно быть установлено True здесь и False там или что-то еще ... – Federico

+0

Посмотрите в окне «Вывод» для уведомлений «First chance exception». Отладка + Исключения, поставьте галочку в поле «Бросок» для исключений CLR, чтобы остановить отладчик. Код HitTest собирается их бросить. –

ответ

1

Не использовать параметр Strict On в вашем коде - это удобство для Visual Basic. Вы получите ошибки во время выполнения вместо ошибок компиляции, когда код окажется неправильным. Это не очень хорошо работает в drag + drop code, но события вызывают с помощью back-stop, который проглатывает все исключения. Единственная диагностика, которую вы получите, - это первое уведомление об исключении в окне вывода. Конечно, легко пропустить.

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

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

Смежные вопросы