VB.NET 2005 - Arrastar e Soltar com TreeView (Drag-and-Drop)


O controle TreeView é muito usado em aplicações onde é preciso apresentar informações no formato hierárquico. A própria natureza da informação hierárquica exige muitas vezes que ela necessite de uma re-organização por parte do usuário. Neste momento as operações de arrastar e soltar fornecem uma solução natural e intuitiva que facilita muito a vida do usuário.

Pensando nisso vou apresentar neste os conceitos básicos relacionados com as operações arrastar-soltar ou drag-and-drop usando o controle TreeView.

O controle TreeView fornece 3 eventos relacionados com ações de arrastar e soltar:

Para poder habilitar operações de arrastar e soltar no controle TreeView você deve definir a sua propriedade AllowDrop como True.

Quando é iniciada uma ação de arrastar em um TreeNode o evento ItemDrag é disparado e para tratá-lo geralmente usamos o seguinte código    :

Public Sub TreeView1_ItemDrag(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles TreeView1.ItemDrag
     'Define o nó Drag e inicia o DragDrop
     DoDragDrop(e.Item, DragDropEffects.Move)
End Sub

Aqui a operação de arratar é iniciada chamando o método DoDragDrop , especificando o objeto TreeNode que esta sendo arrastado e especificando a operação Move que o usuário irá realizar se a operação de arrastar e soltar for completa.

A enumeração DragDropEffects apenas descreve o efeito do cursor que pode ser representado durante a operação e não irá garantir que o objeto será movido.

Com a operação de arrastar em andamento, o controle TreeView precisa reagir quando um objeto é arrastado sobre ele. Quando isto ocorre o evento DragEnter é disparado e necessita ser tratado.

Public Sub TreeView1_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TreeView1.DragEnter

'Verifica se existe um objeto TreeNode sendo arrastado
If e.Data.GetDataPresent("System.Windows.Forms.TreeNode", True) Then
      'Se existir permite o efeito de mover
      e.Effect = DragDropEffects.Move
Else
     'Se não existir , evita o movimento
     e.Effect = DragDropEffects.None
End If
End Sub

No código  estamos verificando se existe um objeto presente na operação de arrastar-soltar que desejamos arrastar sobre o TreeView,  neste caso um objeto TreeNode. A próxima etapa é fazer a validação do objeto que esta sendo arrastado e para encerrar o processo basta tratar o evento DragDrop disparado pelo TreeView.

Vamos agora um exemplo prático usando dois controles TreeView em um formulário separados por um controle SplitterContainer.

Abra o Visual Basic 2005 Express Edition e crie um novo projeto do tipo Windows Application usando a linguagem Visual Basic com o nome dragDropNet

No formulário padrão form1.vb inclua , a partir da ToolBox, guia Containers, um componente SplitterContainer(fig 1.0). A seguir inclua no Panel1 um controle TreeView (TreeView1) e em Panel2 outro controle TreeView(TreeView2)(fig 2.0)

Fig 1.0 - Incluindo um componente SplitterContainer Fig 2.0 - Incluindo dois controles TreeView

Definas as seguintes propriedades para ambos os controles TreeView: HideSelection = False

Agora basta tratar os eventos de mouse e da operação drag-and-drop do TreeView.  O código esta abaixo:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


'define um no treeNOde

Dim node As TreeNode


'define um no para o treeview1 e expande o no

node = TreeView1.Nodes.Add("No 1")

node.Nodes.Add("Folha 1")

node.Nodes.Add("Folha 2")

node.Expand()


'define um no para o treeview2 e expande o no

node = TreeView2.Nodes.Add("No 2")

node.Nodes.Add("Folha 3")

node.Nodes.Add("Folha 4")

node.Expand()


'permite realizar operações de drag-and-drop

TreeView2.AllowDrop = True

TreeView1.AllowDrop = True

End Sub


Private
Sub TreeView1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles
TreeView1.MouseDown, TreeView2.MouseDown


'define uma variável do tipo TreeView

Dim tree As TreeView = CType(sender, TreeView)


'define um node treenode

Dim node As TreeNode


'obtem o nó nas coordenadas definidas pelo mouse

node = tree.GetNodeAt(e.X, e.Y)


'define o modo de seleção

tree.SelectedNode = node


'permite realizar a copia do nó se o objeto nao for nulo

If Not node Is Nothing Then

    tree.DoDragDrop(node.Clone(), DragDropEffects.Copy)

End If

End Sub


Private Sub TreeView2_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TreeView1.DragOver, TreeView2.DragOver


'define uma variável do tipo TreeView

Dim tree As TreeView = CType(sender, TreeView)


'define não permite movimentar

e.Effect = DragDropEffects.None


'se o objeto arrastado não é do tipo treenode e nao for nulo

If Not e.Data.GetData(GetType(TreeNode)) Is Nothing Then

   'define um ponto nas coordenadas do mouse

    Dim pt As New Point(e.X, e.Y)

   pt = tree.PointToClient(pt)

    'obtem o no

    Dim node As TreeNode = tree.GetNodeAt(pt)

     'permite realizar a copia do nó se o objeto nao for nulo

    If Not node Is Nothing Then

       e.Effect = DragDropEffects.Copy

       tree.SelectedNode = node

     End If

End If

End Sub
 

Private Sub TreeView2_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TreeView1.DragDrop, TreeView2.DragDrop


'define uma variável do tipo TreeView

Dim tree As TreeView = CType(sender, TreeView)

Dim pt As New Point(e.X, e.Y)


pt = tree.PointToClient(pt)


'obtem o no e exibe no treeview

Dim node As TreeNode = tree.GetNodeAt(pt)

node.Nodes.Add(e.Data.GetData(GetType(TreeNode)))

node.Expand()

End Sub

Executando o projeto teremos:

Formulário apresentando os Nós originais Operação de drag-and-drop realizada arrastando Folha1 para o Nó Folha4

 

Pegue o projeto completo aqui :   drag_dropNet.zip

 

Você viu neste artigo realizar operações de arrastar e soltar usando o controle TreeView. Podemos realizar esta operação com outros componentes WIndows Forms.

 

Agora é com você: tente , invente,  incremente...

 

Eu sei é apenas VB mas eu gosto... 

 

Referências: http://support.microsoft.com/kb/307967


José Carlos Macoratti