0

ファイルをテキストボックスにドラッグするコードがありますが、ファイルをテキストボックスからドラッグしてクリアするコードも必要です。

誰にもアイデアはありますか?

4

2 に答える 2

0

メソッドを使用DoDragDropして、ドラッグ アンド ドロップ操作を実行できます。データが実際にどこかにドロップされたかどうかを示す値を返しますDragDropEffects。その場合、テキスト ボックスをクリアできます。

ドラッグ アンド ドロップ操作は、マウス ボタンを押しながらマウスを少し動かす前に開始してはならないため、MouseDownおよびMouseMoveイベントで確認する必要があります。SystemInformation.DragSizeドラッグ アンド ドロップ操作を開始する前に、マウスをどれだけ移動する必要があるかを示します。

イベントで、MouseDown実際にドラッグを開始するかどうかを確認します (つまり、左ボタンが押され、テキスト ボックスに実際にテキストが含まれている)。次に、マウスの位置と で指定されたサイズを使用して長方形を作成しますSystemInformation.DragSizeMouseMoveイベントで、マウスが長方形の外側にドラッグされているかどうかを確認し、次を呼び出します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 キーまたはキャンセル キーを押す)、またはテキスト ボックスがフォーカスを失った場合は、テキスト ボックスを非表示にしてラベルを再度表示します。

于 2013-10-11T23:53:21.090 に答える