Tutorial: Llevar a cabo una operación de arrastrar y colocar en formularios Windows Forms

Para realizar las operaciones de arrastrar y colocar en aplicaciones basadas en Windows, debe controlar una serie de eventos, sobre todo los eventos DragEnter, DragLeave y DragDrop. Trabajando con la información disponible en los argumentos de estos eventos, puede facilitar sin problemas las operaciones de arrastrar y colocar.

Arrastrar datos

Todas las operaciones de arrastrar y colocar comienzan con arrastrar. La funcionalidad que permite que se recopilen datos cuando se comienza a arrastrar se implementa en el método DoDragDrop.

En el ejemplo siguiente, se utiliza el evento MouseDown para iniciar la operación de arrastrar, ya que es el más intuitivo (la mayoría de las acciones de arrastrar y colocar empiezan cuando se presiona el botón del mouse). Sin embargo, recuerde que podría utilizarse cualquier evento para iniciar un procedimiento de arrastrar y colocar.

Nota:

Determinados controles tienen eventos personalizados específicos para la acción de arrastrar. Los controles ListView y TreeView, por ejemplo, tienen un evento ItemDrag.

Para iniciar una operación de arrastrar

  1. En el evento MouseDown del control donde se iniciará la operación de arrastrar, utilice el método DoDragDrop para establecer los datos que se van a arrastrar y el efecto permitido que tendrá dicha operación. Para obtener más información, vea Data y AllowedEffect.

    En el ejemplo siguiente se muestra cómo iniciar una operación de arrastrar. El control donde se inicia la operación de arrastrar es un control Button, los datos que se arrastran son la cadena que representa a la propiedad Text del control Button, y los efectos permitidos son, o bien copiar, o bien mover.

    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);  
    }  
    

    Nota:

    En el método DoDragDrop puede utilizarse cualquier dato como parámetro; en el ejemplo anterior, se ha usado la propiedad Text del control Button (en lugar de codificar de forma rígida un valor o de recuperar datos de un conjunto de datos) porque la propiedad estaba relacionada con la ubicación desde la que se arrastra (el control Button). Téngalo en cuenta cuando incorpore operaciones de arrastrar y colocar en aplicaciones basadas en Windows.

Mientras haya una operación de arrastrar en vigor, se puede controlar el evento QueryContinueDrag, que «pide permiso» al sistema para continuar con la operación de arrastrar. Cuando se controla este método, es también el momento adecuado para llamar a métodos que surtirán un efecto sobre la operación de arrastrar, como expandir un TreeNode en un control TreeView cuando se mueve el puntero sobre él.

Colocar datos

Una vez que haya empezado a arrastrar datos desde una ubicación a un control o Windows Forms, naturalmente deseará colocarlos en algún lugar. El cursor cambiará cuando cruce una zona de un formulario o control que esté configurada correctamente para la colocación de datos. Se puede hacer que cualquier área dentro de una forma de Windows Form o cualquier control acepte datos colocados al establecer la propiedad AllowDrop y controlar los eventos DragEnter y DragDrop.

Para llevar a cabo la operación de colocar

  1. Establezca la propiedad AllowDrop en TRUE.

  2. En el evento DragEnter del control donde tendrá lugar la operación de colocar, asegúrese de que los datos que se arrastran sean de un tipo aceptable (en este caso, Text). A continuación, el código establece el efecto que tendrá lugar cuando se produzca la colocación en un valor de la enumeración DragDropEffects. Para obtener más información, vea 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;  
    }  
    

    Nota:

    Puede definir su propio DataFormats especificando su propio objeto como el parámetro Object del método SetData. Cuando lo haga, asegúrese de que el objeto especificado sea serializable. Para obtener más información, vea ISerializable.

  3. En el evento DragDrop para el control donde tiene lugar la operación de colocación, use el método GetData para recuperar los datos que se están arrastrando. Para obtener más información, vea Data.

    En el ejemplo siguiente, se está arrastrando un control TextBox (a donde tendrá lugar la operación de colocar). El código establece la propiedad Text del control TextBox igual a los datos que se están arrastrando.

    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();  
    }  
    

    Nota:

    Además, puede trabajar con la propiedad KeyState, de forma que, en función de las teclas presionadas durante la operación de arrastrar y colocar, tengan lugar ciertos efectos (por ejemplo, es estándar copiar los datos arrastrados cuando se presiona la tecla CTRL).

Consulte también