演练:在 Windows 窗体中执行拖放操作

若要在基于 Windows 的应用程序中执行拖放操作,必须处理一系列事件,尤其是DragEnterDragLeaveDragDrop事件。 通过使用这些事件提供的事件参数信息,可以轻松促进拖放操作。

拖动数据

所有拖放操作都从拖动开始。 DoDragDrop 方法中实现了在拖动开始时收集数据的功能。

在下面的示例中,MouseDown 事件用于启动拖动操作,因为这样做最直观(大多数拖放动作是从鼠标按钮按下开始的)。 但是,请记住,任何事件都可用于启动拖放过程。

注释

某些控件具有自定义拖动特定的事件。 例如,控件ListViewTreeView具有事件ItemDrag

启动拖动操作

  1. 在控件开始拖动的MouseDown事件中,请使用DoDragDrop方法设置要拖动的数据以及允许拖动的效果。 有关详细信息,请参阅 DataAllowedEffect

    以下示例演示如何初始化拖动操作。 拖动开始处的控件是控件 Button ,所拖动的数据是表示 Text 控件属性的 Button 字符串,允许的效果是复制或移动。

    Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
       Button1.DoDragDrop(Button1.Text, DragDropEffects.Copy Or DragDropEffects.Move)
    End Sub
    
    private void button1_MouseDown(object sender,
    System.Windows.Forms.MouseEventArgs e)
    {
       button1.DoDragDrop(button1.Text, DragDropEffects.Copy |
          DragDropEffects.Move);
    }
    

    注释

    任何数据都可以用作方法中的 DoDragDrop 参数;在上面的示例中, Text 使用了控件的属性 Button (而不是对值进行硬编码或从数据集中检索数据),因为该属性与从( Button 控件)拖动的位置相关。 在将拖放操作整合到基于 Windows 的应用程序时,请记住这一点。

在拖动操作生效期间,可以处理 QueryContinueDrag 事件,该事件会“请求系统继续拖动操作的权限”。 处理此方法时,可以在合适的时机调用会影响拖动操作的方法,例如当光标悬停在控件上时展开TreeNode中的TreeView

删除数据

开始从 Windows 窗体或控件上的某个位置拖动数据后,你自然会想要将其拖放到某个位置。 当光标跨越一个已正确配置为放置数据的窗体或控件区域时,它将发生变化。 Windows 窗体或控件中的任何区域都可以通过设置 AllowDrop 属性和处理 DragEnterDragDrop 事件来接受已删除的数据。

执行删除

  1. AllowDrop 属性设置为 true。

  2. DragEnter控件的发生事件中,请确保所拖动的数据是可接受的类型(在本例中为Text)。 然后,该代码将下拉时发生的效果设置为枚举中的DragDropEffects值。 有关详细信息,请参阅 Effect

    Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter
       If (e.Data.GetDataPresent(DataFormats.Text)) Then
         e.Effect = DragDropEffects.Copy
       Else
         e.Effect = DragDropEffects.None
       End If
    End Sub
    
    private void textBox1_DragEnter(object sender,
    System.Windows.Forms.DragEventArgs e)
    {
       if (e.Data.GetDataPresent(DataFormats.Text))
          e.Effect = DragDropEffects.Copy;
       else
          e.Effect = DragDropEffects.None;
    }
    

    注释

    可以通过将自己的对象指定为SetData方法的Object参数来定义自己的DataFormats。 请确保执行此作时,指定的对象是可序列化的。 有关详细信息,请参阅 ISerializable

  3. 在放置发生的控件的DragDrop事件中,使用GetData方法检索被拖动的数据。 有关详细信息,请参阅 Data

    在下面的示例中, TextBox 控件是被拖动到的控件(放置的地方)。 该代码将TextBox控件的Text属性设置为等于所拖动的数据。

    Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop
       TextBox1.Text = e.Data.GetData(DataFormats.Text).ToString
    End Sub
    
    private void textBox1_DragDrop(object sender,
    System.Windows.Forms.DragEventArgs e)
    {
       textBox1.Text = e.Data.GetData(DataFormats.Text).ToString();
    }
    

    注释

    此外,您可以使用KeyState属性,以便通过按键来实现某些效果,例如,按下 CTRL 键时标准操作是复制拖动的数据。不同的按键会导致不同的效果。

另请参阅