Drag & drop in un Treeview: in che modo?

venerdì 25 gennaio 2008 - 16.26

Giovanni_3478 Profilo | Senior Member

Ciao

Ho un treeview con dei nodi

Vorrei poter spostare i nodi con il drag &drop
in nodi posti gerarchicamente ad un livello superiore o inferiore.

Ho settato la proprietà allowDrop del treeview a True.
Poi ho creato questi 2 handler di prova
protected void TreeView_dreagEnter(object sender, DragEventArgs e)
{
MessageBox.Show("Ciao");
}
protected void TreeView_dragLeave(object sender, EventArgs e)
{
MessageBox.Show("Ciao");
}

Il risultato è nullo.
Sia il drag che il drop non possono essere effettuati.

Che sintassi devo usare per effettuare il drag & drop?

aiedail92 Profilo | Expert

Ciao

Per iniziare un'azione di drag&drop devi aggiungere all'evento ItemDrag del tuo treeView una chiamata al metodo treeView.DoDragDrop, specificando nei parametri i dati da trascinare e gli effetti consentiti. A questo punto vengono generati anche gli eventi di Drag&Drop.

Luca

Giovanni_3478 Profilo | Senior Member

Rispondo in ritardo
ma ho dovuto fare delle prove.

Usando
treeView1.DoDragDrop(treeView1.SelectedNode ,DragDropEffects.All);
il drag & drop viene effettuato;
uso poi gli eventi dragEnter dragLeave e dragOver.

Riesco a trascinare l'oggetto e successivamente a recuperarlo con e.Data.GetData(...)

Quello che non riesco a recuperare è il controllo su cui viene effettuato il drop.
Cioè: ho un treeview, effettuo il drag di un nodo e lo trascino su un altro nodo;
bene, come posso ottenere quest' "altro nodo"?

Non so se sono riuscito ad essere chiaro

aiedail92 Profilo | Expert

Nella gestione degli eventi DragEnter, DragDrop e DragOver viene passato un parametro e di tipo DragEventArgs. Fra le proprietà di e ci sono X e Y che sono le coordinate su schermo della posizione del mouse al momento della generazione dell'evento. Sfruttando queste due proprietà e il metodo GetNodeAt del TreeView puoi ottenere il nodo su cui puntava il mouse quando viene generato l'evento:

//Da inserire nell'evento DragEnter, DragDrop o DragOver TreeNode node = tuoTreeView.GetNodeAt(tuoTreeView.PointToClient(new Point(e.X, e.Y)));

Luca

Giovanni_3478 Profilo | Senior Member

ciao

il drag & drop funziona, il metodo GetNodeAt pure.

Ho notato però che nel evento dragLeave del TreeView,
non è possibile sapere qual'è il punto del controllo dove viene rilasciato l'elemento.

Esempio: io trascino il nodo "nome" e lo sposto nel nodo "persone";
bene, nel evento dragLeave in non riesco ad ottenere il nodo "persone"
per poi effettuarvi delle operazione
come un aggiunta di un nodo con treeView1.nodes.add(nomeNodo);

Sono riuscito comunque ad ottenere il nodo creando una serie di variabili nei vari eventi di drag.
C'è un modo specifico per ottenere il nodo in cui si effettua il drop nell'evento dragLeave?

aiedail92 Profilo | Expert

ciao

Allora, se non sbaglio l'evento DragLeave viene generato quando, mentre Drag&Droppi, il mouse lascia il controllo (quindi la treeview, non il nodo). Perciò è impossibile ottenere il nodo nel quale effettui il drop dall'evento DragLeave, in quanto questo nodo non esiste.
Se hai bisogno di conoscere il nodo sul quale viene conclusa l'azione di drag&drop devi utilizzare il metodo GetNodeAt nell'evento DragDrop; invece è presente l'evento DragOver che viene generato quando l'oggetto viene mosso all'interno dei limiti della treeview.

Quindi se tu hai bisogno di rilasciare il nodo "nome" in "presone", "persone" lo ottieni nell'evento DragDrop della treeview:

private void tuaTreeView_DragDrop(object sender, DragEventArgs e) { TreeNode persone = tuaTreeView.GetNodeAt(tuaTreeView.PointToClient(new Point(e.X, e.Y))); TreeNode nome = (TreeNode)e.Data.GetData(typeof(TreeNode)); }

Luca

Giovanni_3478 Profilo | Senior Member

con il tuo aiuto ho risolto

grazie mille


Ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5