Vb.net 如果我拖出文本,如何清除文本框

Vb.net 如果我拖出文本,如何清除文本框,vb.net,Vb.net,我有代码将文件拖入文本框,但我也希望有代码将文件拖出文本框,从而清除它 有人有什么想法吗 查看文本框上的DragLeave事件 最简单的方法可能是将其存储为变量,或者在离开应用程序时存储在剪贴板中 Private Sub TheTextBox_DragLeave(sender As System.Object, e As System.EventArgs) Handles TheTextBox.DragLeave Clipboard.SetText(TheTextBox.Text) Th

我有代码将文件拖入文本框,但我也希望有代码将文件拖出文本框,从而清除它


有人有什么想法吗

查看文本框上的DragLeave事件 最简单的方法可能是将其存储为变量,或者在离开应用程序时存储在剪贴板中

    Private Sub TheTextBox_DragLeave(sender As System.Object, e As System.EventArgs) Handles TheTextBox.DragLeave
Clipboard.SetText(TheTextBox.Text)
TheTextBox.Clear() 'Optional

End Sub
然后,您需要编写当您将鼠标向上移动或拖动到或其他位置时发生的情况。您可以通过以下步骤之一清除文本框。取决于您的实现。

您可以使用该方法执行拖放操作。它返回一个值,该值指定数据是否确实已被删除,在这种情况下,您可以清除文本框

由于在按下鼠标按钮时,在鼠标移动一点之前不应启动拖放操作,因此需要在
MouseDown
MouseMove
事件中检查是否有此情况。告诉您在开始拖放操作之前应将鼠标移动多远

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
Private\u dragStart作为布尔值
私有_拖动框为矩形
私有子srcTextBox\u MouseDown(发送方作为对象,e作为MouseEventArgs)处理srcTextBox.MouseDown
'如果按下鼠标左键,并且文本框实际包含任何文本,则开始拖动
_dragStart=e.Button=MouseButtons.Left而非String.IsNullOrEmpty(srcTextBox.Text)
如果_dragStart那么
Dim dragSize As Size=SystemInformation.dragSize
_dragBox=新矩形(新点(e.X-(dragSize.Width\2),
e、 Y-(dragSize.Height\2)),dragSize)
如果结束
端接头
私有子srcTextBox\u MouseUp(发送方作为对象,e作为MouseEventArgs)处理srcTextBox.MouseUp
_dragStart=False
端接头
私有子srcTextBox\u MouseMove(发送者作为对象,e作为MouseEventArgs)处理srcTextBox.MouseMove
如果没有_dragStart或
(e.按钮和鼠标按钮。左)鼠标按钮。左或
_dragBox.Contains(e.X,e.Y)然后返回
将数据变暗为新数据对象()
data.SetData(srcTextBox.Text)
'您可以选择添加有效拖动目标所需的更多格式:
'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))
将DragDropEffects变暗为DragDropEffects=srcTextBox.DoDragDrop(数据,DragDropEffects.Move)
如果(dropEffect=DragDropEffects.Move),则
srcTextBox.Text=“”
如果结束
_dragStart=False
_dragBox=Rectangle.Empty
端接头
私有子destTextBox_DragOver(ByVal sender作为对象,ByVal e作为DragEventArgs)处理destTextBox.DragOver
如果e.Data.GetDataPresent(GetType(String)),则
e、 效果=e.AllowedEffects和DragDropEffects.Move
其他的
e、 效果=DragDropEffects。无
如果结束
端接头
私有子destTextBox_DragDrop(ByVal sender作为对象,ByVal e作为DragEventArgs)处理destTextBox.DragDrop
如果e.Data.GetDataPresent(GetType(String)),则
destTextBox.Text=e.Data.GetData(GetType(String)).ToString()
如果结束
端接头
在文本框中拖动鼠标通常会启动文本选择。上面的代码更改了此行为。用户不能再使用鼠标选择文本。这显然不是一个好主意,因为用户不会期望这样。要允许使用鼠标和拖动选择文本,您需要控制选择机制。这意味着您需要创建自己的文本框类


我建议采用另一种方法:使用一个标签,将值显示为拖动源和/或目标。要允许编辑,可以创建隐藏文本框。如果用户双击标签,则隐藏标签并显示文本框。用户完成编辑后(通过按enter或cancel),或者如果文本框失去焦点,则隐藏文本框并再次显示标签。

显示一些当前代码会有帮助您是否在自己的应用程序中拖动?在实际拖放之前清除文本框是没有意义的,因为用户可能会取消拖动。如果在你自己的应用程序中,那么你可以将文本框本身设置为拖动的数据,这样你就可以抓取数据并在拖放时清除文本框。你的意思是将
可选的
注释放在剪贴板相关行上吗?如果你想清除文本框,请使用文本框。clear()否则,请不要在代码中添加该行清除文本框是问题,而不是存储数据的可能性:这就是为什么我质疑您在回答中评论为可选部分的内容。我不想将源文本框拖到目标文本框,所以我将“Handles destTextBox.DragDrop”改为“Handles Me.DragDrop”它按照我想要的方式工作!!谢谢佩斯科利诺!!