Compartilhar via


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

Para executar operações de arrastar-e-soltar em aplicativos baseados no Windows você precisa lidar uma série de eventos, mais especialmente os eventos DragEnter, DragLeave e DragDrop. Trabalhando com as informações disponíveis nos argumentos deste evento, você pode facilmente orientar as operações de arrastar-e-soltar.

Arrastando Dados

Todas as operações de arrastar-e-soltar começam com arrastar. A funcionalidade de permitir que 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 ele é o mais intuitivo (a maioria das ações arrastar-e-soltar começa com o botão do mouse sendo pressionado). No entanto, lembre-se de que qualquer evento pode ser utilizado para iniciar um procedimento de arrastar-e-soltar.

ObservaçãoObservação

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

Para iniciar uma operação de arrastar

  • No evento MouseDown do controle onde o arrastamento começará, use o método DoDragDrop para definir os dados a serem arrastados e o efeito permitido para o arrastamento. Para obter mais informações, consulte Data e AllowedEffect.

    O exemplo a seguir mostra como iniciar um operação de arrastar. O controle onde o arrastamento começa é um controle Button, os dados que estão sendo arrastados são a sequência 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);
    }
    
    private void button1_MouseDown(Object sender,
    System.Windows.Forms.MouseEventArgs e)
    {
       button1.DoDragDrop(button1.get_Text(), DragDropEffects.Copy |
          DragDropEffects.Move);
    }
    
    ObservaçãoObservação

    Qualquer dado pode ser usado como um parâmetro no método DoDragDrop; no exemplo acima, a propriedade Text do controle Button foi usada (em vez código embutir um valor ou recuperar dados de um DataSet) porque a propriedade estava relacionada com o local de onde está sendo arrastada (o controle Button). Tenha isso em mente quando você 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, ele é também o ponto apropriado para você chamar métodos que terão um efeito sobre a operação de arrastar, com expandir uma TreeNode em um controle TreeView quando o cursor passa sobre ele.

Soltando Dados

Após você ter começou a arrastar dados a partir de um local em um Formulário do Windows ou controle, você naturalmente desejará soltá-lo em algum lugar. O cursor será alterado ao cruzar uma área de um formulário ou controle que está configurado corretamente para nele soltar dados. Qualquer área em um Formulário do Windows ou controle pode ser feita para aceitar dados soltos, definindo a propriedade AllowDrop e manipulando 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 onde os dados serão soltos, verifique se os dados que estão sendo arrastados são de um tipo aceitável (neste caso, Text). O código então define o efeito que acontecerá quando ocorre a operação de soltar 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;
    }
    
    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);
    }
    
    ObservaçãoObservaçã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 é serializável. Para obter mais informações, consulte interface ISerializable.

  3. No evento DragDrop do controle onde a operação de soltar irá ocorrer, use o método GetData para recuperar os dados que estão sendo arrastados. Para mais informações, consulte DtaObject.Data Property.

    No exemplo a seguir, um controle TextBox é o controle sendo arrastado para (onde a operação de soltar irá ocorrer). O código define a propriedade Text do controle TextBox igual aos dados que está 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();
    }
    
    private void textBox1_DragDrop(Object sender,
    System.Windows.Forms.DragEventArgs e)
    {
       textBox1.set_Text
    (e.get_Data().GetData(DataFormats.Text).ToString());
    }
    
    ObservaçãoObservaçã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, determinados efeitos ocorram (por exemplo, ele é padrão para copiar os dados arrastados quando a tecla CTRL estiver pressionada).

Consulte também

Tarefas

Como: Adicionar dados para a área de transferência.

Como: Recuperar dados da área de transferência

Outros recursos

Operações de Arrastar e Soltar e Suporte à Área de Transferência