Ver Mensaje Individual
  #4 (permalink)  
Antiguo 26/06/2008, 10:15
kyha
 
Fecha de Ingreso: junio-2008
Ubicación: Valencia
Mensajes: 152
Antigüedad: 15 años, 11 meses
Puntos: 3
Respuesta: Arrastrar un treenode

Aqui esta la solucion.Es mi evento DrapDrop de un treeview,donde el usuario arrastrando el nodo ordenara el arbol como quiera.En ningun momento se le deja que pueda cambiar la categoria del nodo.si es un 2º hijo siempre sera 2º hijo.
Si alguien con mas conocimietnos que yo ve posibles cambios me gustaria que los comentarais.

Private Sub arbol_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles arbol.DragDrop

If e.Data.GetDataPresent("System.Windows.Forms.TreeNo de", False) Then
' variable que sirve para guardar el valor del nodo de destino
Dim DestinationNode As TreeNode
'el nodo seleccionado sera el nodo anterior al destino
DestinationNode = arbol.SelectedNode
Dim nodosg As Integer
nodosg = prueba(DestinationNode.Tag + 1, CInt(DestinationNode.Name))
'para que el usuario al arrastrarlo sobre si mismo no haga nada
If DestinationNode.Name <> NodoOrigen.Name Then
'si el nodo destino es el nodo siguiente al nodo origen
If nodosg <> CInt(NodoOrigen.Name) Then
'Comprobamos que tiene nodo siguiente de su mismo nivel
Dim nextNode As TreeNode = arbol.SelectedNode.NextNode

'el nodo arrastrado solo pueda ser arrastrado a nodos de su mismo nivel
If NodoOrigen.Tag = DestinationNode.Tag Then

Dim parentNodo As Object = arbol.SelectedNode.Parent
Dim indicedNext As Integer

Dim prevNode As TreeNode = arbol.SelectedNode.PrevNode
If nextNode IsNot Nothing Then
indicedNext = nextNode.Index

If TypeOf parentNodo Is TreeNode Then
If indicedNext < NodoOrigen.Index Then ' el movimiento de arrastrar es hacia arriba
CType(parentNodo, TreeNode).Nodes.Remove(CType(parentNodo, TreeNode).Nodes(NodoOrigen.Index))
CType(parentNodo, TreeNode).Nodes.Insert(indicedNext, NodoOrigen)
Else ' el movimiento de arrastrar es hacia abajo
indicedNext = nextNode.Index
CType(parentNodo, TreeNode).Nodes.Remove(CType(parentNodo, TreeNode).Nodes(NodoOrigen.Index))
CType(parentNodo, TreeNode).Nodes.Insert(indicedNext - 1, NodoOrigen)
End If
End If
Else
'creamos un nuevo nodo
Dim nodo As TreeNode
'obtenemos el nodo superior del nodo seleccionado
nodo = DestinationNode.Parent
'Borramos el nodo
NodoOrigen.Remove()
'Le decimos que el nodo seleccionado debe ser un hijo del nodo superior
nodo.Nodes.Add(CType(NodoOrigen.Clone, TreeNode))
End If
'Seleccionamos el arrastrado
arbol.SelectedNode = CType(parentNodo, TreeNode).Nodes(indicedNext)
'Con esta funcion guardariamos el cambio de orden en la BD
' modNodArrastre(NodoOrigen, DestinationNode)
End If
End If
End If
End If

End Sub