Hola a todos

Este post, más que una duda, lo quiero dejar como un apunte por si a alguien le ocurre lo mismo que a mí. El caso es que quería hacer drap & drop desde un grid view (en modo múltiple) hacia un tree view. Básicamente tuve 3 problemas graves.

1. Selección del nodo de destino - > Quería que al moverme por el tree view haciendo drag, se me fueran seleccionando los nodos para poder elegir, cosa que gambas no hace de por sí. En el ejemplo de gambas de Drag & Drop (que por cierto, no funciona) se muestra como hacer esto.

2. No me pregunteis por qué, pues no lo sé. Pero para que funcione, el evento DRAG del tree view tiene que estar escrito (aunque no lo use). Si quito el código de abajo, el programa deja de funcionar, a pesar de que no hago nada!! en el evento. Preguntaré en la lista de gambas porque huele a BUG

Public Sub arbol_listas_Drag()
' NO BORRAR
End


3. Para acabar de rematar la faena: Al estar en modo múltiple el grid, al hacer drag y luego drop en el tree, la selección de elementos en el grid origen se volvía loca. Para evitarlo, colocar un STOP EVENT al final del evento MOUSE DRAG del grid view.

Escribo todo esto porque no os imagináis la que he tenido que formar para hacer funcionar el código y por más que buscaba, no daba con la solución. Os dejo el código de los cuatro eventos que he tenido que programar. Si veis algo mejorable, ya me comentais

Public Sub listado_MouseDrag()
Dim cadena As String
Dim i As Long
If Mouse.Left = True Then
For i = 1 To listado.Rows.Count
If listado.Rows[i - 1].Selected = True Then
cadena = cadena & listado[i - 1, 1].Text & "/"
Endif
Next
cadena = Left(cadena, Len(cadena) - 1)
listado.Drag(cadena)
End If
Stop Event
End
Public Sub arbol_listas_Drop()
Dim elementos As String[]
Dim i As Integer
Dim rs As Result
Dim clave As String
clave = ""
If Not arbol_listas.FindAt(Drag.X, Drag.Y) Then
clave = arbol_listas.Item.Key
Endif
' Necesito el id de la lista a la que mando los elementos
If arbol_listas.Count > 0 And IsNumber(clave) Then
rs = mBBDD.dbOMM.Exec("SELECT * FROM listas WHERE padre=" & CInt(clave))
If rs.Count > 0 Then Return
elementos = Split(Drag.Data, "/")
For i = 1 To elementos.Count
mBBDD.dbOMM.Exec("DELETE FROM fichas_listas WHERE id_lista=" & CInt(clave) & " AND id_ficha=" & CInt(elementos[i - 1]))
rs = mBBDD.dbOMM.Create("fichas_listas")
rs["id_lista"] = CInt(clave)
rs["id_ficha"] = CInt(elementos[i - 1])
rs.Update
Next
cargar_arbol(CInt(clave))
End If
End
Public Sub arbol_listas_DragMove()
With arbol_listas
If Not .FindAt(Drag.X, Drag.Y) Then
arbol_listas.UnselectAll
arbol_listas.Item.Selected = True
Endif
End With
End
Public Sub arbol_listas_Drag()
' NO BORRAR
End


[edito] El UnselectAll al arbol lo hago porque también es múltiple y si no lo coloco, se me seleccionan todos los elementos del arbol por los que me muevo mientras arrastro.