ファイルをテキストボックスにドラッグするコードがありますが、ファイルをテキストボックスからドラッグしてクリアするコードも必要です。
誰にもアイデアはありますか?
メソッドを使用DoDragDrop
して、ドラッグ アンド ドロップ操作を実行できます。データが実際にどこかにドロップされたかどうかを示す値を返しますDragDropEffects
。その場合、テキスト ボックスをクリアできます。
ドラッグ アンド ドロップ操作は、マウス ボタンを押しながらマウスを少し動かす前に開始してはならないため、MouseDown
およびMouseMove
イベントで確認する必要があります。SystemInformation.DragSize
ドラッグ アンド ドロップ操作を開始する前に、マウスをどれだけ移動する必要があるかを示します。
イベントで、MouseDown
実際にドラッグを開始するかどうかを確認します (つまり、左ボタンが押され、テキスト ボックスに実際にテキストが含まれている)。次に、マウスの位置と で指定されたサイズを使用して長方形を作成しますSystemInformation.DragSize
。MouseMove
イベントで、マウスが長方形の外側にドラッグされているかどうかを確認し、次を呼び出しますDoDragDrop
。
Private _dragStart As Boolean
Private _dragBox As Rectangle
Private Sub srcTextBox_MouseDown(sender As Object, e As MouseEventArgs) Handles srcTextBox.MouseDown
' a drag starts if the left mouse button is pressed and the text box actually contains any text
_dragStart = e.Button = MouseButtons.Left And Not String.IsNullOrEmpty(srcTextBox.Text)
If _dragStart Then
Dim dragSize As Size = SystemInformation.DragSize
_dragBox = New Rectangle(New Point(e.X - (dragSize.Width \ 2),
e.Y - (dragSize.Height \ 2)), dragSize)
End If
End Sub
Private Sub srcTextBox_MouseUp(sender As Object, e As MouseEventArgs) Handles srcTextBox.MouseUp
_dragStart = False
End Sub
Private Sub srcTextBox_MouseMove(sender As Object, e As MouseEventArgs) Handles srcTextBox.MouseMove
If Not _dragStart Or
(e.Button And MouseButtons.Left) <> MouseButtons.Left Or
_dragBox.Contains(e.X, e.Y) Then Return
Dim data As New DataObject()
data.SetData(srcTextBox.Text)
' you can optionally add more formats required by valid drag destinations:
' data.SetData(DataFormats.UnicodeText, Encoding.Unicode.GetBytes(srcTextBox.Text))
' data.SetData("UTF-8", Encoding.UTF8.GetBytes(srcTextBox.Text))
' data.SetData("UTF-32", Encoding.UTF32.GetBytes(srcTextBox.Text))
Dim dropEffect As DragDropEffects = srcTextBox.DoDragDrop(data, DragDropEffects.Move)
If (dropEffect = DragDropEffects.Move) Then
srcTextBox.Text = ""
End If
_dragStart = False
_dragBox = Rectangle.Empty
End Sub
Private Sub destTextBox_DragOver(ByVal sender As Object, ByVal e As DragEventArgs) Handles destTextBox.DragOver
If e.Data.GetDataPresent(GetType(String)) Then
e.Effect = e.AllowedEffect And DragDropEffects.Move
Else
e.Effect = DragDropEffects.None
End If
End Sub
Private Sub destTextBox_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles destTextBox.DragDrop
If e.Data.GetDataPresent(GetType(String)) Then
destTextBox.Text = e.Data.GetData(GetType(String)).ToString()
End If
End Sub
通常、TextBox 内でマウスをドラッグすると、テキストの選択が開始されます。上記のコードは、この動作を変更します。ユーザーはマウスを使用してテキストを選択できなくなります。ユーザーはそれを期待していないため、これは明らかに良い考えではありません。マウスによるテキスト選択とドラッグの両方を可能にするには、選択メカニズムを制御する必要があります。つまり、独自のテキスト ボックス クラスを作成する必要があります。
別のアプローチをお勧めします。値をドラッグ元および/または宛先として示すラベルを使用します。編集できるようにするには、非表示のテキスト ボックスを作成します。ユーザーがラベルをダブルクリックすると、ラベルが非表示になり、テキスト ボックスが表示されます。ユーザーが編集を終了した後 (Enter キーまたはキャンセル キーを押す)、またはテキスト ボックスがフォーカスを失った場合は、テキスト ボックスを非表示にしてラベルを再度表示します。