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

Actualización: noviembre 2007

Para realizar las operaciones de arrastrar y colocar en las aplicaciones basadas en Windows, debe controlar una serie de eventos, sobre todo DragEnter, DragLeave y DragDrop. La información disponible en los argumentos de estos eventos facilita, de forma muy sencilla, las operaciones de arrastrar y colocar.

Arrastrar datos

Todas las opciones de arrastrar y colocar empiezan por arrastrar. La función de habilitar la posibilidad de recopilar los datos cuando se inicia la operación de arrastrar se implementa en el método DoDragDrop.

En el ejemplo siguiente, se usa el evento MouseDown para iniciar la operación de arrastrar, ya que es más intuitivo (la mayor parte de acciones de arrastrar y colocar se inician cuando se presiona el botón del mouse). No obstante, recuerde que puede utilizarse cualquier evento para iniciar un procedimiento de arrastrar y colocar.

Nota:

Algunos controles disponen de eventos de arrastrar personalizados. Los controles ListView y TreeView, por ejemplo, tienen un evento ItemDrag.

Para iniciar una operación de arrastre

  • En el evento MouseDown del control en el que se va a iniciar la operación, utilice el método DoDragDrop para establecer los datos que se arrastrarán, y el efecto 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 arrastre: Si el control donde se va a iniciar la operación es un control Button, los datos que se arrastran corresponden a la cadena que representa la propiedad Text del control Button, y los efectos permitidos son copiar o 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);
    }
    
    private void button1_MouseDown(Object sender,
    System.Windows.Forms.MouseEventArgs e)
    {
       button1.DoDragDrop(button1.get_Text(), DragDropEffects.Copy |
          DragDropEffects.Move);
    }
    
    Nota:

    Se puede usar cualquier dato como parámetro en el método DoDragDrop; en el ejemplo anterior, se usó la propiedad Text del control Button (en lugar de incluir un valor incluido en el código o recuperar datos desde un conjunto de datos) porque la propiedad estaba relacionada con la ubicación desde la que se realizó la operación de arrastrar (el control Button). No lo olvide cuando incorpore operaciones de arrastrar y colocar a aplicaciones para Windows.

Mientras esté vigente una operación de arrastrar, se puede controlar el evento QueryContinueDrag, que "pide permiso" al sistema para continuar la operación de arrastrar. Cuando se realice este método, también conviene recordar llamar a métodos que tengan un efecto sobre la operación de arrastrar, como expandir un TreeNode en un control TreeView cuando se cursor se desplaza sobre él.

Colocar datos

Una vez que haya empezado a arrastrar datos desde un formulario Windows Forms o desde un control, lo natural será que desee colocarlos en algún lugar. El cursor cambiará cuando cruce un área de un formulario o control que esté correctamente configurada para colocar datos. Se puede hacer que cualquier área dentro de un formulario Windows Forms o un control acepte datos colocados si se establece la propiedad AllowDrop y se controlan los eventos DragEnter y DragDrop.

Para colocar

  1. Establezca la propiedad AllowDrop en true.

  2. En el evento DragEnter del control donde tiene lugar la operación de colocar, asegúrese de que los datos que se están arrastrando tienen un tipo aceptable (en este caso, Text). A continuación, el código establece el efecto que tendrá lugar al colocar como 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;
    }
    
    private void textBox1_DragEnter(Object sender,
    System.Windows.Forms.DragEventArgs e)
    {
       if (e.get_Data().GetDataPresent(DataFormats.Text))
          e.set_Effect(DragDropEffects.Copy);
       else
          e.set_Effect(DragDropEffects.None);
    }
    
    Nota:

    Puede definir sus propios 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 (interfaz).

  3. En el evento DragDrop del control donde tiene lugar la operación de colocar, utilice el método GetData para recuperar los datos que se arrastran. Para obtener más información, vea DtaObject.Data Property.

    En el ejemplo siguiente, el control TextBox es el control que se está arrastrando (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();
    }
    
    private void textBox1_DragDrop(Object sender,
    System.Windows.Forms.DragEventArgs e)
    {
       textBox1.set_Text
    (e.get_Data().GetData(DataFormats.Text).ToString());
    }
    
    Nota:

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

Vea también

Tareas

Cómo: Agregar datos al Portapapeles

Cómo: Recuperar datos del Portapapeles

Otros recursos

Compatibilidad con las operaciones de arrastrar y colocar y con el Portapapeles