Partilhar via


Passo a passo: Executando uma operação de arrastar e soltar no Windows Forms

Para executar operações de arrastar e soltar em aplicativos baseados no Windows, você deve manipular uma série de eventos, principalmente os eventos DragEnter, DragLeavee DragDrop. Ao trabalhar com as informações disponíveis nos argumentos de evento desses eventos, você pode facilmente facilitar as operações de arrastar e soltar.

Arrastando dados

Todas as operações de arrastar e soltar começam com a ação de arrastar. A funcionalidade para permitir que os dados sejam coletados quando o arrastamento começa é implementada no método DoDragDrop.

No exemplo a seguir, o evento MouseDown é usado para iniciar a operação de arrastar porque é o mais intuitivo (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 de arrastar e soltar.

Observação

Certos 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 onde o arrasto começará, use o método DoDragDrop para definir os dados a serem arrastados e o efeito permitido que o arrasto 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 arrasto 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 copiar ou 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);  
    }  
    

    Observação

    Todos os dados podem ser utilizados como 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 de (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 manipular o evento QueryContinueDrag, que "pede permissão" do sistema para continuar a operação de arrastar. Ao manipular esse método, também é o ponto apropriado para você chamar métodos que terão um efeito na operação de arrastar, como expandir um TreeNode em um controle de TreeView quando o cursor passa sobre ele.

Descartando dados

Depois de começar a arrastar dados de um local em um Windows Form ou controle, você naturalmente vai querer soltá-los em algum lugar. O cursor mudará quando cruzar uma área de um formulário ou controle configurado corretamente para soltar dados. Qualquer área dentro de um Windows Form ou controle pode ser feita para aceitar dados descartados definindo a propriedade AllowDrop e manipulando os eventos DragEnter e DragDrop.

Para executar uma queda

  1. Defina a propriedade AllowDrop como true.

  2. No caso DragEnter para o controle onde a queda ocorrerá, verifique se os dados que estão sendo arrastados são de um tipo aceitável (neste caso, Text). Em seguida, o código define o efeito que acontecerá 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, ao fazer isso, de que o objeto especificado é serializável. Para obter mais informações, consulte ISerializable.

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

    No exemplo abaixo, um controle TextBox é o controle que está sendo arrastado para (onde a queda ocorrerá). 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, para que, dependendo das teclas pressionadas durante a operação de arrastar e soltar, certos efeitos ocorram (por exemplo, é padrão copiar os dados arrastados quando a tecla CTRL é pressionada).

Ver também