Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Drag & Drop
Forum - C# / VB.NET - Drag & Drop

Avatar
gvigliani (Normal User)
Pro


Messaggi: 106
Iscritto: 30/12/2006

Segnala al moderatore
Postato alle 12:19
Domenica, 17/10/2010
Ciao a tutti.
Ho un problemino che , come sempre , spero mi aiuterete a risolvere. Ho una TreeView con dei nodi e sottonodi  ed un Panel che dovrebbe ricevere una informazione relativa al nodo cliccato e trasportato.
ho creato questa sub relativa alla treeview
Codice sorgente - presumibilmente VB.NET

  1. Private Sub tvMarkets_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles tvMarkets.DragEnter
  2.         If e.Data.GetDataPresent(DataFormats.Text) Then
  3.             e.Effect = DragDropEffects.Copy
  4.         Else
  5.             e.Effect = DragDropEffects.None
  6.         End If
  7.     End Sub



Mentre queste altre 2 si riferiscono al Panel che riceve:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub tbox_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles tbox.DragEnter
  2.         If e.Data.GetDataPresent(DataFormats.Text) Then
  3.             e.Effect = DragDropEffects.Copy
  4.         Else
  5.             e.Effect = DragDropEffects.None
  6.         End If
  7.     End Sub
  8. Private Sub tbox_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles tbox.DragDrop
  9.         Dim dummy As String = "hello"
  10.         Dim s As String = CStr(e.Data.GetData(dummy.GetType()))
  11.         s = s.Substring((s.IndexOf(":") + 1)).Trim()
  12.         Position.X = e.X
  13.         Position.Y = e.Y
  14.         Position = tbox.PointToClient(Position)
  15.         MsgBox(s)
  16.  
  17.     End Sub



Il problema è che il codice mi comunica , tramite la msgbox(s) il testo relativo al nome del nodo e non il Node.Name che a me interessa.

Avete un modo per risolvere il mio problema?
Allego anche il codice che mi da' proprio questa informazione se clicco sul nodo interessato senza ovviamente il drag & Drop.

Codice sorgente - presumibilmente VB.NET

  1. Private Sub tvMarkets_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tvMarkets.AfterSelect
  2.         If e.Node.Nodes.Count = 0 Then
  3.             Dim marketId As Integer = Val(e.Node.Name)    'This is the selected marketId  
  4.         End If
  5.     End Sub




PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 16:29
Domenica, 17/10/2010
Posta il codice che contiene la chiamata a DoDragDrop, il nome del nodo e il valore di s (ossia il risultato atteso e quello effettivo).

PM Quote
Avatar
gvigliani (Normal User)
Pro


Messaggi: 106
Iscritto: 30/12/2006

Segnala al moderatore
Postato alle 16:51
Domenica, 17/10/2010
Il codice relativo alla chiamata di tvmarkets è quello gia' postato .
Codice sorgente - presumibilmente VB.NET

  1. Private Sub tvMarkets_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles tvMarkets.DragEnter
  2.         If e.Data.GetDataPresent(DataFormats.Text) Then
  3.             e.Effect = DragDropEffects.Copy
  4.         Else
  5.             e.Effect = DragDropEffects.None
  6.         End If
  7. End Sub
  8.  
  9. ' questa è per il Drag_enter del Panel che riceve
  10. Private Sub tbox_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles tbox.DragEnter
  11.         If e.Data.GetDataPresent(DataFormats.Text) Then
  12.             e.Effect = DragDropEffects.Copy
  13.         Else
  14.             e.Effect = DragDropEffects.None
  15.         End If
  16. End Sub
  17.  
  18. ' Questo è il DragDrop che riceve
  19. Private Sub tbox_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles tbox.DragDrop
  20.         Dim dummy As String = "hello"
  21.         Dim s As String = CStr(e.Data.GetData(dummy.GetType()))
  22.         s = s.Substring((s.IndexOf(":") + 1)).Trim()
  23.         Position.X = e.X
  24.         Position.Y = e.Y
  25.         Position = tbox.PointToClient(Position)
  26.         MsgBox(s)
  27.  
  28. End Sub



La Treeview contiene Nodi e sottonodi annidati. Soltanto l'ultimo nodo contiene in node.name un codice numerico intero per risalire a informazioni contenute in Api.

Il codice a cui risalgo cliccando semplicemente sul nodo della Treeview è:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub tvMarkets_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tvMarkets.AfterSelect
  2.         If e.Node.Nodes.Count = 0 Then
  3.             [b]Dim marketId As Integer = Val(e.Node.Name)[/b]    
  4.         End If
  5. End Sub



Come si puo' evincere dall'immagine allegata, esistono dei nodi principali e poi a scalare sempre piu' in profondita' fino ad arrivare a quelli definitivi i cui nomi sono:
Risultato Esatto
Asian Handicap
Piu' / Meno 6,5 gol
etc

Soltanto questi nodi , contengono in node.name il codice di ricerca con i dati associati e che, in questo caso , sono quelli relativi alle quote etc.

Grazie


gvigliani ha allegato un file: serieNodi.jpg (51776 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:30
Lunedì, 18/10/2010
Ti ho detto di postare il codice contenente la chiamata a DoDragDrop. Dato che ti stai crucciando su ciò che viene visualizzato (presumo sia node.Text, non l'hai detto) vorrei almeno vedere se hai associato al drag la proprietà giusta, ossia node.Name.

PM Quote
Avatar
gvigliani (Normal User)
Pro


Messaggi: 106
Iscritto: 30/12/2006

Segnala al moderatore
Postato alle 19:42
Lunedì, 18/10/2010
Hai ragione . Avevo dimenticato di postare il codice da te richiesto.
Codice sorgente - presumibilmente VB.NET

  1. Private Sub tvMarkets_ItemDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles tvMarkets.ItemDrag
  2.         Dim strItem As String = e.Item.ToString()
  3.         DoDragDrop(strItem, DragDropEffects.Copy Or DragDropEffects.Move)
  4.     End Sub



Nello specifico mi viene proposto il nome del nodo e non il suo contenuto.
Ho provato a sostituire a strItem  il node.Name ma mi dà errore.

Saluti

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 20:59
Martedì, 19/10/2010
Testo quotato

Postato originariamente da gvigliani:

Hai ragione . Avevo dimenticato di postare il codice da te richiesto.
Codice sorgente - presumibilmente VB.NET

  1. Private Sub tvMarkets_ItemDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles tvMarkets.ItemDrag
  2.         Dim strItem As String = e.Item.ToString()
  3.         DoDragDrop(strItem, DragDropEffects.Copy Or DragDropEffects.Move)
  4.     End Sub



Nello specifico mi viene proposto il nome del nodo e non il suo contenuto.
Ho provato a sostituire a strItem  il node.Name ma mi dà errore.

Saluti



Prima chiariamo una cosa. Il nome del nodo è il valore contenuto nella proprietà node.Name. ll contenuto del nodo è una locuzione ambigua, quindi non la prenderò in considerazione. Il testo del nodo è il valore esposto dalla proprietà node.Text.
Nella fattispecie, e.Item è di tipo Object, ma nel caso sia l'argomento di un evento richiamato da treeview contiene un oggetto di tipo TreeViewNode. Quindi e.Item.ToString() equivale a node.ToString(), che equivale a node.Text (oppure a "System.Windows.Forms.TreeViewNode", non ricordo), ma sicuramente non a node.Name.
Risolto l'arcano...

Ultima modifica effettuata da Il Totem il 19/10/2010 alle 20:59
PM Quote
Avatar
gvigliani (Normal User)
Pro


Messaggi: 106
Iscritto: 30/12/2006

Segnala al moderatore
Postato alle 21:22
Martedì, 19/10/2010
Caro amico,
ti ringrazio innanzitutto per lo sforzo che stai facendo per capire il mio problema.
L'arcano non è per me risolto e continua a rimanere tale.
Dai una occhiata a 'sto codice

Codice sorgente - presumibilmente VB.NET

  1. For j = 1 To UBound(Ids)              
  2.        If Not Nodes.ContainsKey(Ids(j)) Then
  3.           Dim Node As New TreeNode       'Add a new node if it doesn't exist
  4.           Node.Text = If(j <= UBound(Names), Names(j), .marketName)
  5.           Node.Name = Ids(j)  'This is the key
  6.           Node.Tag = Format(.eventDate.AddHours(2), "HH:mm")
  7.        end if
  8.  next j



Come puoi notare ,  in node.text memorizzo il nome del Nodo, in node.name  il codice che mi interessa, ed in node.tag  la data dell'evento.
Il valore che dovrei riuscire a recuperare è quello contenuto in Node.Name che sara' anche ambigua :asd: ma che è quella che in effetti mi interessa.

Grazie

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 21:44
Martedì, 19/10/2010
Ma questo non cambia quello che hai scritto. Tu hai detto che vuoi trascinare node.name, però in DoDragDrop passi nome.Text, quindi mi sembra evidente ciò che devi cambiare per ottenere il risultato che vuoi.
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim Id As String = DirectCast(e.Item, TreeViewNode).Name



N.B.: ciò che stai facendo è molto poco elegante. Potevi usare una struttura e metterla tutta nel tag.

PM Quote