Compartilhar via


Passo a passo: executando uma operação de arrastar e soltar nos Windows Forms

Para executar operações de arrastar e soltar em aplicativos baseados no Windows, você deve lidar com uma série de eventos, principalmente os eventos DragEnter, DragLeavee DragDrop. Trabalhando com as informações disponíveis no evento argumentos desses eventos, você pode facilmente orientar as operações do tipo "arrastar e soltar".

Arrastando dados

Todas as operações do tipo "arrastar e soltar" começam com arrastar. A funcionalidade para a coleta de dados ser iniciada quando o arraste começa é implementada no método DoDragDrop.

No exemplo a seguir, o evento MouseDown é usado para iniciar a operação de arrastar porque é a mais intuitiva (a maioria das ações de arrastar e soltar começa com o botão do mouse sendo pressionado). No entanto, lembre-se de que qualquer evento pode ser usado para iniciar um procedimento do tipo "arrastar e soltar".

Observação

Determinados controles têm eventos específicos de arrastar personalizados. Os controles ListView e TreeView, por exemplo, têm um evento ItemDrag.

Para iniciar uma operação de arrastar

  1. No evento MouseDown para o controle em que a operação de arrastar começará, use o método DoDragDrop para definir os dados a serem arrastados e o efeito permitido que a operação de arrastar terá. Para obter mais informações, consulte Data e AllowedEffect.

    O exemplo a seguir mostra como iniciar uma operação de arrastar. O controle onde o arrastar começa é um controle Button, os dados que estão sendo arrastados são a cadeia de caracteres que representa a propriedade Text do controle Button, e os efeitos permitidos são de cópia ou movimentação.

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

    Observação

    Todos os dados podem ser usados como um parâmetro no método DoDragDrop; no exemplo acima, a propriedade Text do controle Button foi usada (em vez de codificar um valor ou recuperar dados de um conjunto de dados) porque a propriedade estava relacionada ao local que estava sendo arrastado (o controle Button). Tenha isso em mente ao incorporar operações de arrastar e soltar em seus aplicativos baseados no Windows.

Enquanto uma operação de arrastar estiver em vigor, você pode lidar com o evento QueryContinueDrag, que "pede permissão" do sistema para continuar a operação de arrastar. Ao lidar com esse método, esse também é o ponto apropriado para você chamar métodos que terão um efeito sobre a operação de arrastar, como expandir um TreeNode em um controle TreeView quando o cursor estiver sobre ele.

Descartando dados

Depois de começar a arrastar dados de um lugar em um formulário ou controle no Windows, você naturalmente desejará soltá-los em algum lugar. O cursor mudará ao cruzar uma área de um formulário ou controle que esteja configurado corretamente para receber os dados soltados. Qualquer área dentro de um formulário ou controle do Windows pode ser feita para aceitar dados descartados definindo a propriedade AllowDrop e tratando os eventos DragEnter e DragDrop.

Para executar uma operação de soltar

  1. Defina a propriedade AllowDrop como true.

  2. No evento DragEnter para o controle em que a queda ocorrerá, verifique se os dados que estão sendo arrastados são de um tipo aceitável (nesse caso, Text). Em seguida, o código define o efeito que ocorrerá quando a queda ocorrer para um valor na enumeração DragDropEffects. Para obter mais informações, consulte 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;
    }
    

    Observação

    Você pode definir seu próprio DataFormats especificando seu próprio objeto como o parâmetro Object do método SetData. Certifique-se de que, ao fazer isso, o objeto especificado seja serializável. Para obter mais informações, consulte ISerializable.

  3. No evento DragDrop para o controle em que ocorrerá a queda, use o método GetData para recuperar os dados que estão sendo arrastados. Para obter mais informações, consulte Data.

    No exemplo a seguir, um controle TextBox é o controle que será o destino da ação de arrastar (onde ocorrerá a soltura). O código define a propriedade Text do controle TextBox igual aos dados que estão sendo arrastados.

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

    Observação

    Além disso, você pode trabalhar com a propriedade KeyState, de modo que, dependendo das chaves pressionadas durante a operação de arrastar e soltar, determinados efeitos ocorram (por exemplo, é padrão copiar os dados arrastados quando a tecla CTRL é pressionada).

Consulte também