Artigo: 307968 - Última revisão: segunda-feira, 21 de Julho de 2008 - Revisão: 4.0

Como adicionar funcionalidade de arrastar e largar TreeView numa aplicação Visual C#

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Para obter uma Microsoft Visual Basic .NET versão deste artigo, consulte 307967  (http://support.microsoft.com/kb/307967/ ) .
Para obter uma versão de Microsoft Visual C++ .NET deste artigo, consulte 815675  (http://support.microsoft.com/kb/815675/ ) .

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Este artigo passo a passo descreve como efectuar uma operação de arrastar e largar connosco de árvore entre dois controlos de TreeView numa aplicação Visual C#.

Requisitos

A lista seguinte descreve o hardware recomendado, software, infra-estrutura de rede e service packs que necessita:
  • O Visual C#
Este artigo pressupõe que está familiarizado com os seguintes tópicos:
  • Controlo do Windows Forms TreeView
  • Processamento de eventos do Windows Forms

Descrição da técnica

O controlo TreeView fornece três eventos de arrastar e largar deve processar:
  • ItemDrag : Este evento é desencadeado da origem de controlo TreeView assim que o utilizador começa a arrastar o nó da árvore. Quando esta situação ocorre, chame o método DoDragDrop para iniciar o procedimento de arrastar e largar.
  • DragEnter : depois de iniciar a operação de arrastar e largar, deve processar o evento DragEnter no destino controlo TreeView . Este evento ocorre quando o utilizador arrasta o objecto TreeNode da origem de controlo TreeView a um ponto dos limites do destino controlo TreeView . O evento DragEnter permite o controlo TreeView para especificar se a operação de arrastar é válida para este controlo de destino. O código de exemplo neste artigo permite que a operação de mover.
  • DragDrop : O último evento para processar é o evento DragDrop do destino controlo TreeView . Este evento ocorre quando o objecto de TreeNode que é arrastado foi eliminado no destino controlo TreeView . Para processar este evento, obter o objecto TreeNode e adicionar o objecto para o destino controlo TreeView . O código de exemplo utiliza o objecto de dados para obter os dados.
O código de exemplo neste artigo garante que um objecto de TreeNode tem sido arrastado para o destino controlo TreeView . O método GetData do objecto dados obtém o nó que é arrastado o controlo de origem. O método GetNodeAt determina onde este nó será ignorado no controlo de destino. Depois de determinar a posição, adicione o nó de origem como um subordinado do nó de destino. Uma vez que este exemplo executa uma operação de mudança, o último passo consiste em remover o nó de origem do controlo TreeView original.

Passos para criar o exemplo

  1. Crie uma nova aplicação do Windows no Visual C#. Por predefinição, é criado um formulário é denominado Form1.
  2. Utilize a caixa de ferramentas para adicionar dois controlos de TreeView ao Form1. Por predefinição, são criados TreeView1 e TreeView2 .
  3. Para permitir que os controlos de TreeView para ser arrastado e largado, altere a propriedade AllowDrop de TreeView1 e TreeView2 para Verdadeiro na janela Propriedades.
  4. Faça duplo clique em Form1 para gerar o processador de método de evento de carregamento do Form1. Add the following code to populate the two TreeView controls with TreeNode objects and to define the event handlers:
    private void Form1_Load(object sender, System.EventArgs e)
    		{
    			TreeNode ParentNode1;
    			TreeNode ParentNode2;
    
    			ParentNode1 = treeView1.Nodes.Add("tv1");
    			ParentNode1.Nodes.Add("tv1FirstChild");
    			ParentNode1.Nodes.Add("tv1SecondChild");
    			ParentNode1.Nodes.Add("tv1ThirdChild");
    			ParentNode1.Nodes.Add("tv1FourthChild");
    			ParentNode1.Expand();
    
    			ParentNode2 = treeView2.Nodes.Add("tv2");
    			ParentNode2.Nodes.Add("tv2FirstChild");
    			ParentNode2.Nodes.Add("tv2SecondChild");
    			ParentNode2.Expand();
    			this.treeView1.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag);
    			this.treeView2.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag);
    			this.treeView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView_DragEnter);
    			this.treeView2.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeView_DragEnter);
    			this.treeView1.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView_DragDrop);
    			this.treeView2.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeView_DragDrop);	
    		}
  5. Adicione o processador de método seguinte para processar o evento ItemDrag TreeView1 ou TreeView2 , dependendo da direcção da operação arrastar. Este código inicia uma operação de mudança no item que está a ser arrastado.
    private void treeView_ItemDrag(object sender,
    			System.Windows.Forms.ItemDragEventArgs e)
    		{
    			DoDragDrop(e.Item, DragDropEffects.Move);
    		}
  6. Adicionar o processador de método seguinte para processar o evento DragEnter TreeView1 ou TreeView2 , dependendo da direcção da operação arrastar:
    private void treeView_DragEnter(object sender,
    			System.Windows.Forms.DragEventArgs e)
    		{
    			e.Effect = DragDropEffects.Move;
    		}
  7. Adicione o seguinte método à classe Form1 isso segue imediatamente o método que adicionou no passo anterior:
    private void treeView_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
    		{
    			TreeNode NewNode;
    
    			if(e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))
    			{
    				Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
    				TreeNode DestinationNode = ((TreeView)sender).GetNodeAt(pt);
    				NewNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
    				if(DestinationNode.TreeView != NewNode.TreeView)
    				{     
    					DestinationNode.Nodes.Add((TreeNode) NewNode.Clone());
    					DestinationNode.Expand();
    					//Remove Original Node
    					NewNode.Remove();
    				}
    			}
    		}
  8. Crie e execute o projecto. Arraste nós de um controlo TreeView para o outro. Note que o nó é removido o controlo de origem e é adicionado como um nó subordinado no controlo de destino.

Notas

O exemplo fornecido neste artigo destina-se apenas a fins de demonstração. Por conseguinte, o exemplo ilustra apenas como utilizar o controlo TreeView num cenário simplificado. Para manter o exemplo pequeno, não são considerados vários cenários. Por exemplo, o código não permite efectuar uma operação de arrastar e largar connosco no mesmo controlo TreeView .

O código também não processa o cenário em que um utilizador não largue o objecto num determinado nó no destino controlo TreeView . Para gerir este cenário, teste se NóDestino for nulo; se for, pode adicionar o objecto que está a ser arrastado para a raiz do controlo TreeView e assim sucessivamente.

Referências

Para mais informações, consulte os seguintes Web sites da Microsoft Developer Network (MSDN):
Eventos DragEnter
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dragenter(VS.71).aspx (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dragenter(VS.71).aspx)

Eventos de DragDrop
http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.dragdrop(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.dragdrop(vs.71).aspx)

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C# 2008 Express Edition
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbsweptvs2008 kbhowtomaster kbsample KB307968 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 307968  (http://support.microsoft.com/kb/307968/en-us/ )