2012-02-12 94 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上徘徊。

相關問題