
26/06/2008, 10:15
|
| | Fecha de Ingreso: junio-2008 Ubicación: Valencia
Mensajes: 152
Antigüedad: 16 años, 7 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 |