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 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 = TrueTreeView1.AllowDrop = True End SubPrivate Sub TreeView1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TreeView1.MouseDown, TreeView2.MouseDown
'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
'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
'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