Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

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

Windowsフォーム ドラッグ ドロップ タグの編集...

投稿者 くりたけ   (社会人)   投稿日時 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