RichTextBoxからのドラッグ&ドロップでドラッグ元を判別

タグの編集
投稿者 くりたけ  (社会人) 投稿日時 2013/2/28 07:37:12
RichTextBoxで選択したテキストを別コントロールにドロップしたいのですが、別コントロールにドロップした時に、例えばドロップ先のDragDropイベントで、ドラッグ元のRichTextBoxを判別する方法はありますでしょうか?
ドラッグ元のRichTextBoxのMouseDownやMouseMoveイベントでDoDragDropメソッドを呼び出し、引数にドラッグ元のRichTextBoxを割り当てれば識別用に使えるかなと思ったのですが、これらのマウスイベントでDoDragDropを行うとRichTextBox内のテキストをマウスで選択できなくなってしまいます。
(これは、以下のドラッグ&ドロップについての講座「5.ドラッグ」にも記載されています。)

http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard22.htm

ドラッグ元の識別は、対象のRichTextBoxか、それ以外(外部ソフトからのドラッグも含む)を判別できればいいです。

環境はVB2008です。

よろしくお願いします。
投稿者 shu  (社会人) 投稿日時 2013/3/1 09:36:33
文字が選択状態であったらDoDragDropをすればよいのではないでしょうか?
DoDragDropを行うまえに必要な情報を取得しそれを適当に作成したクラスの
インスタンスに設定してDoDragDropに渡すというのはどうでしょう?
投稿者 るきお  (社会人) 投稿日時 2013/3/16 10:25:58
DoDragDropを使用するタイミングの問題でしょうか。
とりあえずMouseLeaveを使ってみたところうまくうごくようです。
私が試したプログラムは以下の通りです。
Public Class Form1

    Private Sub TextBox1_DragEnter(sender As Object, e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter

        e.Effect = DragDropEffects.Copy

    End Sub

    Private Sub TextBox1_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop

        Dim info As DragDropInformation = e.Data.GetData(GetType(DragDropInformation))

        If info IsNot Nothing Then
            TextBox1.Text = info.Text
            Label1.Text = info.Source.Name
        Else
            TextBox1.Text = ""
            Label1.Text = ""
        End If

    End Sub

    Private Sub RichTextBox1_MouseLeave(sender As Object, e As System.EventArgs) Handles RichTextBox1.MouseLeave
        If Control.MouseButtons <> Windows.Forms.MouseButtons.Left Then
            Return
        End If

        If Len(RichTextBox1.SelectedText) > 0 Then
            Dim info As New DragDropInformation
            info.Text = RichTextBox1.SelectedText
            info.Source = sender
            RichTextBox1.DoDragDrop(info, DragDropEffects.Copy)
        End If
    End Sub

End Class

Public Class DragDropInformation
    Public Property Text As String
    Public Property Source As Control
End Class