2012-02-12 14 views
1

タイトルは私の問題をよく表しています。私の問題のもう少し詳細な説明は次のとおりです。UserControl内のオブジェクトでDragDropイベントが発生しません(ただし、DragEnterは行います)

実行時にTabPagesで作成するTabControlでアプリケーションを構築しています。コードの最初のバージョンでは、これらのTabPageは子リストビューで埋められました。 ListViewは、AddHandlersを使用してDragEnterおよびDragDropルーチンにリンクするコードでも作成されました。すべてがうまくいきました...

これで、すべてのコントロールをコードで作成するのではなく、ListViewといくつかのボタンを含むUserControlを作成しました。 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() 

第二版:ユーザーコントロール はまず、AnnoncesListViewが含まれているユーザーコントロールTabAnnoncesContentを、想像し、そして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ルーチン私はテキストとリストビューを入力するときに実行されますが、私はマウスを離すと、その後、AnnonceListView_DragDropイベントが発生されることはありません。

+0

「動作しません」と診断することは不可能です。このような質問。コードスニペットを投稿します。 –

+0

私は要求通りにコードを追加しましたが、私はそれがどんなヘルプ(標準のドラッグアンドドロップコード)であろうと非常に疑念があります。私はAllowDropプロパティのような何かがここにTrueを設定し、そこにFalseか何かを設定する必要があると期待していました。 – Federico

+0

"First chance exception"通知を出力ウィンドウで探します。 Debug + Exceptionsを選択した場合は、CLR例外のThrownボックスにチェックを入れて、デバッガを停止させます。ヒットテストのコードは、それらを投げる予定です。 –

答えて

1

オプションを使用していませんあなたのコードでStrict Onを使用すると、Visual Basicが便利になります。コードが間違っていると、コンパイルエラーではなくランタイムエラーが発生します。それはドラッグ+ドロップコードでうまくいきませんが、イベントはすべての例外を取り除くバックストップで呼び出されます。あなたが得る唯一の診断は、出力ウィンドウの最初の例外の例外通知です。もちろん見逃せません。

Anyhoo、Debug + Exceptions、例外時にデバッガを停止させるチェックボックスをスローします。そしてOption Strictあなたのソースコードファイルの一番上に、これらの種類の間違いを早期に捕らえることができます。しかし、これはC#に似た、異なるコード記述スタイルを必要とします。

Btwの場合は、DragOverイベントも実装する必要があります。したがって、ListViewのHitTest()メソッドを呼び出して、ユーザーがListViewItem上に実際にホバーしていることを確認できます。

関連する問題