Newsgroup: it.comp.lang.visual-basic
Titolo: Domande sul ontrollo ListView e, in generale, su Drag & Drop

Salve,
provengo dall'ambiente di Access 97 e conosco molto poco di Drag&Drop e di
controlli ActiveX in genere.
Vi chiedo dei consigli sull'uso del controllo ListView (ma credo che con
opportuni adattamenti siano validi anche per TreeView).
Mi trovo appunto a utilizzare un controllo ListView (in visualizzazione
Report) nel modo seguente (vi prego di segnalarmi eventuali
errori/ottimizzazioni nel procedimento):
-per convenzione chiamerò il controllo in questione FIGLIA-
1-all'evento Reposition (del controllo Data della Form) la ListView viene
svuotata con il metodo:
    FIGLIA.ListItems.Remove 1
ripetuto per il numero di items della ListView;
2-la ListView viene ri-popolata a partire da un Recordset (che chiamerò
Recordset) con il metodo:
    FIGLIA.Add(, chiave, testo)
ripetuto per tutti i record del Recordset;
*primo problema: la chiave non può essere una stringa contenente solo
numeri, tipo "883" !!! il valore "a883" viene invece accettato (chissà
perchè? boh);
**ciò comporta quindi che, nella chiave della ListView, NON posso scrivere
direttamente il valore della chiave primaria (ID) del recordset, ma devo
scrivere una funzione che aggiunga, per esempio, una lettera iniziale (da
"883" a "a883");
3-voglio aggiungere un item a FIGLIA, trascinandolo da un altro controllo
ListView, che chiamerò MADRE (generata con lo stesso modo di cui a punti 1 e
2 a partire da un altro Recordset)?
Dopo aver opportunamente settato le proprietà OLEDragMode e OLEDropMode di
entrambi i controlli, utilizzo l'evento OLEDragDrop di FIGLIA.
In particolare: individuo la chiave dell'elemento selezionato
(MADRE.SelectedItem.Key), con una funzione opposta alla precedente (da
"a883" a "883"), quindi ricavo il valore della chiave primaria (ID) del
relativo Recordset, vado a cercare il record in questione, lo aggiungo al
Recordset di FIGLIA, svuoto FIGLIA come in (1) e riempio FIGLIA come in (2).
Non so se tutto ciò sia il massimo dell'economia elaborativa (ditemelo voi)
ma funziona.
Ma se volessi cambiare l'ordine di visualizzazione degli items (a parte
l'ordine alfabetico), come posso fare? Non ho trovato risposta a questo
problema nè sulle guide in linea, nè esplorando il Visualizzatore Oggetti.
Se seleziono un item di FIGLIA e lo trascino in un'altra posizione (di
FIGLIA) non saprei proprio come fare...
Parimenti, se trascino un item da MADRE a FIGLIA non so come inserirlo nella
posizione dell'elenco dove viene rilasciato.
Inoltre, esiste un modo per vedere dove si sta rilasciando un item DURANTE
il Drag&Drop (similmente ai menu di Windows 98 tanto per capirci) con un
segnaposto o qualcosa di simile?
Chi è così gentile da darmi consigli (anche generici) in tal senso?
Grazie in anticipo a tutti.
Mauro.
-------------------------------------------------------------
"Non è morto ciò che in eterno può attendere,
e col passar di strane ere, anche la morte muore."
H. P. Lovecraft, The Nameless City (1921), in Weird Tales, novembre 1938.

 FIGLIA) non saprei proprio come fare...
La proprietà
    FIGLIA.Sorted
deve essere FALSE.
Poi *prova* con
    FIGLIA.ListItems(elementoTrascinato).Index = nuovaposizione
dove nuovaposizione e' l'indice dell'elemento che si trova sotto l'elemento trascinato...
(non sono sicuro che sia possibile modificare la proprietà index cosi' semplicemente)
Per una TreeView funziona cosi' (non dovrebbe essere diverso per una ListView):
###CODICE-TREEVIEW:#####################################
Private Sub TreeView1_DragDrop(Source As Control, x As Single, y As Single)
  Dim nodZ As Node
  If Not TreeView1.DropHighlight Is Nothing Then
    Set nodZ = TreeView1.DropHighlight
    If nodX <> nodZ Then
      'Cls
      Debug.Print nodX.Text & " dropped on " & nodZ.Text
      On Error GoTo checkerror ' To prevent circular errors.
      Set nodX.Parent = nodZ
    End If
  End If
  Set TreeView1.DropHighlight = Nothing
  indrag = False
Exit Sub
checkerror:
  Const CircularError = 35614   ' Define constants to represent Visual Basic errors code.
  If Err.Number = CircularError Then
    Warning "A node can't be made a child of its own children."
  End If
  Set TreeView1.DropHighlight = Nothing
  indrag = False
End Sub
Private Sub TreeView1_DragOver(Source As Control, x As Single, y As Single, State As
Integer)
    ' Set DropHighlight to the mouse's coordinates.
    Set TreeView1.DropHighlight = TreeView1.HitTest(x, y)
End Sub
###FINE-CODICE-TREEVIEW:#####################################

 (non sono sicuro che sia possibile modificare la proprietà index cosi'
semplicemente)
Ok: incrocerò questi suggerimenti con il post di Diego dell'8.4.2001 e vedrò
di tirarne fuori qualcosa di funzionante.
Grazie per i consigli e per il codice :-)
