Nascondere delle stringhe sulla treeview

martedì 27 marzo 2007 - 15.28

trinity Profilo | Guru

ragazzi una domanda semplice ma alquanto complicata

vedete l'immagine?


233x83 9Kb


Da coem potete notare prima dei nomi ci sono dei codici che ho notevolmente bisogno di avere in lista ma per un discorso estetico c'è la possibilità di rendere invisibili ossia nasconderli? nella listview per esempio azzero la larghezza della colonna nella treeview non so cosa fare

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Usa il TAG dell'oggetto nodo. Puoi memorizzarci qualunque oggetto, anche una classe appositamente creata per organizzare i dati che ti servono. Se poi ti basta metterci quel pezzetto di stringa,è ancora più facile!

trinity Profilo | Guru

>Usa il TAG dell'oggetto nodo. Puoi memorizzarci qualunque oggetto,
>anche una classe appositamente creata per organizzare i dati
>che ti servono. Se poi ti basta metterci quel pezzetto di stringa,è
>ancora più facile!

scusami ma come potrei fare? non ho mai utilizzato la treeview e una classe che potrei associare, mica mi potresti far vedere un piccolo esempio

Ciao

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Io ho usato il treeview solo in una occasione e non sono certo un esperto, ma spesso uso il TAG dei vari oggetti che maneggio. Nel caso specifico quello che ti suggerisco di fare è di togliere la parte di stringa prima del trattino (con un comando 'split'?) e metterla nel TAG del nodo, dove potrai recuperarla al momento del bisogno. Qualcosa tipo:


Dim N As New TreeNode("pippo")
N.Tag = "00027/56"
Me.TreeView1.Nodes.Add(N)

Siccome nel TAG puoi mettere qualunque oggetto, potresti anche infilarci qualcosa di più complesso, ma qui stiamo a fare accademia, visto che la tua esigenza è molto più semplice.

trinity Profilo | Guru

ho provato a fare come dici tu ma non mi quadra una cosa.

Prima di tutto se noti l'immagine, il nodo che si chiama "Mauro Cirillo" a un nodo figlio, tutti questi nodi io li carico tramite un ciclo for che di seguito ti descrivo in linea di massima per farti capire:


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

questo codice deriva da una classe che richiama una stored procedure.

comunque se io faccio come hai detto te nel ciclo for il Tag di ogni nodo si valorizzera prima del dato 001/17 e successivamente 002/19 e pare che funziona solo che il mio problema è il seguente:

Nel caricamento della treeview si devono vedere solo il cognome/nome mentre nel tag andrei a salvarci il valore 001/17 ed in modo ciclico 002/19 ma poi io sull'evento TreeView1_AfterSelect clicco sul nodo che mi serve ed oltre a prelevare il cognome e nome mi serve il dato 001/17 che a monte avevo messo nel tag qui nasce il vero problema perchè stavo pensando di fare e.Node.Tag ma non mi restituisce nessun valore.

ecco il codice mettendo i dati nel tag:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

solo che se facco nell'evento click o AfterSelect una semplice MsgBox (N.Tag) noto che prende il valore solo dell'ultimo tag valorizzato

ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

In riferimento a questa riga:

N.Tag = String.Format("{0:D3}", SchedinePSColl.Item(i).IdComponente) & "/" & SchedinePSColl.Item(i).CodAlloggiato

mi sta sfuggendo il punto in cui definisci il nodo N di cui scrivi il TAG.
Ho l'impressione che tu non stia scrivendo nel TAG dello specifico nodo su cui lavori nel ciclo.

trinity Profilo | Guru

>In riferimento a questa riga:
>
>N.Tag = String.Format("{0:D3}", SchedinePSColl.Item(i).IdComponente)
>& "/" & SchedinePSColl.Item(i).CodAlloggiato
>
>mi sta sfuggendo il punto in cui definisci il nodo N di cui scrivi
>il TAG.

lo definisco con una private in questo modo:

Private N As New TreeNode("TreeSchedine")

>Ho l'impressione che tu non stia scrivendo nel TAG dello specifico
>nodo su cui lavori nel ciclo.

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Ma quel nodo 'N' non lo riassoci in alcun punto allo specifico nodo su cui stai lavorando?
Secondo me c'è un malinteso di fondo. Tu deviscrivere nel TAG del nodo in esame, ad esempioi, tanto per usare il nodo N e rifarmi al mio esempio, ecco come potresti cambiare il codice dello ELSE:

Da:

N.Tag = String.Format("{0:D3}", SchedinePSColl.Item(i).IdComponente) & "/" & SchedinePSColl.Item(i).CodAlloggiato

Me.TreeView1.Nodes(IndexNodo).Nodes(0).Nodes.Add("TreeSchedine", String.Format("{0:D3}", SchedinePSColl.Item(i).IdComponente) & "/" & SchedinePSColl.Item(i).CodAlloggiato & " - " & SchedinePSColl.Item(i).CognomeAlloggiato & " " & SchedinePSColl.Item(i).NomeAlloggiato, 2)


A (scritto a mano...occhio alle bischerate che potrei averci messo!):

Dim N As New TreeNode(("TreeSchedine", String.Format("{0:D3}", SchedinePSColl.Item(i).IdComponente) & "/" & SchedinePSColl.Item(i).CodAlloggiato & " - " & SchedinePSColl.Item(i).CognomeAlloggiato & " " & SchedinePSColl.Item(i).NomeAlloggiato, 2)

N.Tag = String.Format("{0:D3}", SchedinePSColl.Item(i).IdComponente) & "/" & SchedinePSColl.Item(i).CodAlloggiato

Me.TreeView1.Nodes(IndexNodo).Nodes.Add(N)

Un po' come faresti per aggiungere item ad un listview.
Non so se ti ho chiarito il mio discorso. Il fatto è che OGNI nodo ha un suo TAG e tu devi scrivere nel TAG dello specifico nodo, non in quello di un signor nodo N che non ha niente a che vedere con gli oggetti (nodi) che stai aggiungendo al tuo albero.





trinity Profilo | Guru

ok ma poi quando clicco sulla treeview devo riprendere il valore salvato nel tag del nodo corrispondente su cui ho cliccato. Quando clicco sulla treeview attivo l'evento AfterSelect cmq potrei farlo anche sul semplice evento click.

Ps. non so se oltre a questo puoi aiutarmi.
Quando clicco sulla treeview ed eseguo il codice nell'evento afterselect, al termine c'è una riga del genere Me.TextBox3.Focus() ma il focus su questa Text non ci va ossia controllando con il debug ci passa e poi va altrove. STrano! sapresti dirmi qualcosa in merito?
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Non ricordo bene come funziona la treeview, comunque sicuramente devi passare anche per un evento che ti restituisca come argomento il nodo su cui hai cliccato, così da prelevarne il TAG, magari poi puoi utilizzarlo, una volta salvato, anche in un evento successivo. Fammi sapere se ti funziona. Dovrebbe, comunque!
Per il focus, non so proprio che dirti. Il focus è una brutta bestia da debuggare. A volte, tanto per interferirci il meno possible e per capire come sta girando, conviene far scrivere dei messaggi tipo: Prendo il focus e Perdo il focus nella finestra di debug, nella gestione degli eventi relativi all'acquisizione e perdita del focus, ovviamente relativi al controllo che intendiamo monitorare. Ovvio che se ti compare una finestra di dialogo, il focus te lo ruba lei. Comunque i motivi possono essere tanti e andrebbero analizzati in un nuovo thread, con tutte le info del caso. Meglio sarebbe poter avere il progetto sotto gli occhi, perchè spesso, come dicevo, il focus è elusivo e bisogna rompersi un po' le scatole facendo un po' di tenattivi per capire come gira.

trinity Profilo | Guru

ecco così funziona tutto


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

però l'unica cosa che non mi riesco a spiegare se vedi anche tu e che nel TreeNode P non faccio come nel TreeNode N Me.TreeView1.Nodes(IndexNodo).Nodes.Add(N)

perchè se scrivo così: Me.TreeView1.Nodes(IndexNodo).Nodes.Add(P) mi esce l'errore che vedi nell'immagine.


764x127 18Kb


P.s. dimenticavo nel nodopadre dovrei settare l'icona che deve essere visualizzata quando il nodo viene selezionato. Sai come si fa?
Io ho fatto così secondo te va bene?(a funzionà funziona)

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Non so niente dell'icona, purtroppo.
L'errore che ti viene fuori, già che si parlava delle anlaogie col listview, è esattamente lo stesso di quando si tenta di spostare un item da una posizione all'altra. Molto spesso si cerca di inserire un certo item in una diversa posizione, dimenticandosi che l'item è un oggetto con tutte le sue caratteristiche ed è 'unico' e soprattutto non è dotato di bilocazione!
Questo implica che per spostare, ad esempio, alla riga superiore un certo item del listview, prima quell'item va rimosso dalla posizione attuale e DOPO reinserito in quella voluta.
Se si vuole duplicare una riga, allora bisogna clonarla e inserire lo item clone nella posizione desiderata.
L'errore che ti spara, sembra avere una origine molto simile.

trinity Profilo | Guru

Pero stavo vedendo un pò sulla rete
Vedi link
http://support.microsoft.com/kb/814735/it

alla fine è come faccio io oppure mi sbaglio?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Riguardo all'errore, credo tu debba modificare il tuo codice da così:

Me.TreeView1.Nodes.Add(NodoPadre)
IndexNodo = Me.TreeView1.GetNodeCount(False) - 1 REM RICAVO IL COUNT DEI NODI DELLA STRTTURA PRINCIPALE
Dim P As TreeNode
P = New TreeNode
P = NodoPadre.Nodes.Add("TreeSchedine", SchedinePSColl.Item(i).CognomeAlloggiato & " " & SchedinePSColl.Item(i).NomeAlloggiato, 1)
P.Tag = String.Format("{0:D3}", SchedinePSColl.Item(i).IdComponente) & "/" & SchedinePSColl.Item(i).CodAlloggiato

a così:

Me.TreeView1.Nodes.Add(NodoPadre)
IndexNodo = Me.TreeView1.GetNodeCount(False) - 1 REM RICAVO IL COUNT DEI NODI DELLA STRTTURA PRINCIPALE
Dim P As TreeNode
P = New TreeNode("TreeSchedine", SchedinePSColl.Item(i).CognomeAlloggiato & " " & SchedinePSColl.Item(i).NomeAlloggiato, 1)
NodoPadre.Nodes.Add(P)
P.Tag = String.Format("{0:D3}", SchedinePSColl.Item(i).IdComponente) & "/" & SchedinePSColl.Item(i).CodAlloggiato

Lo stesso vale anche per la parte dell'ELSE dove ti va liscia solo perchè non aggiungi il 'nodopadre' alla treeview. Ovviamente facendo come ti indico, il TAG lo assegni al nodo P, che hai appena aggiunto al nodo padre. Nella versione che hai scritto tu invece, presumo temo che tu assegnassi a P un riferimento a nodopadre (in pratica erano lo stesso nodo) per via di questa riga:

P = NodoPadre.Nodes.Add("TreeSchedine", SchedinePSColl.Item(i).CognomeAlloggiato & " " & SchedinePSColl.Item(i).NomeAlloggiato, 1)

Fammi sapere....

trinity Profilo | Guru

ho scritto come hai detto te ossia così:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ma mi esce un errore il messaggio di errore si trova nell'immagine di sotto:


771x128 15Kb


questo errore avviene nella prima parte della if ossia dove dichiaro P come nodo e precisamente l'errore si genera nel momento in cui il codice esegue: NodoPadre.Nodes.Add(P)

tieni però presente che IndexNodo mi serve per gestire i vari nodi figli a scalare perchè P ed N sono già dei nodi figli alla fine.

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Io ti ho detto di scrivere così:

Me.TreeView1.Nodes.Add(NodoPadre)
IndexNodo = Me.TreeView1.GetNodeCount(False) - 1 REM RICAVO IL COUNT DEI NODI DELLA STRTTURA PRINCIPALE
Dim P As TreeNode
P = New TreeNode("TreeSchedine", SchedinePSColl.Item(i).CognomeAlloggiato & " " & SchedinePSColl.Item(i).NomeAlloggiato, 1)
NodoPadre.Nodes.Add(P)
P.Tag = String.Format("{0:D3}", SchedinePSColl.Item(i).IdComponente) & "/" & SchedinePSColl.Item(i).CodAlloggiato


e tu mi posti questo codice, dicendo che è come ho detto io:

Me.TreeView1.Nodes.Add(NodoPadre)
IndexNodo = Me.TreeView1.GetNodeCount(False) - 1 REM RICAVO IL COUNT DEI NODI DELLA STRTTURA PRINCIPALE
Dim P As TreeNode
P = New TreeNode
P = NodoPadre.Nodes.Add("TreeSchedine", SchedinePSColl.Item(i).CognomeAlloggiato & " " & SchedinePSColl.Item(i).NomeAlloggiato, 1)
NodoPadre.Nodes.Add(P)
P.Tag = String.Format("{0:D3}", SchedinePSColl.Item(i).IdComponente) & "/" & SchedinePSColl.Item(i).CodAlloggiato


Ti sembrano uguali?
Poi, potrebbe anche non funzionare il mio suggerimento (non ho potuto provarlo), ma sicuramente tu non lo hai adottato!

trinity Profilo | Guru

Ops hai ragione

solo che ho provato il tuo codice e a questa riga:

P = New TreeNode("TreeSchedine", SchedinePSColl.Item(i).CognomeAlloggiato & " " & SchedinePSColl.Item(i).NomeAlloggiato, 1)

nell'elenco errori del compilatore esce il seguente messaggio:

Errore 1 Option Strict On non consente conversioni implicite da "String" a "Integer".


ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Sì, come ti dicevo non l'ho compilato, solo scritto a mano usando il copiaincolla del tuo codice. Del resto non posso ricostruirmi tutto il tuo progetto per provarlo!
L'errore che segnali è un banale errore di casting dei parametri. Se hai capito il concetto, basta che tu assegni nella maniera giusta i parametri di inizializzazione del nodo, seguendo l'intellisense e sapendo cosa sono le cose che ci stai scrivendo dentro ... e quelle le sai solo tu!
Vediamo se arriviamo in fondo

trinity Profilo | Guru

ho scritto così:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ma ora non mi da errore ma la treeview carica un dato sballato:

ecco il caricamento errato:

232x49 3Kb


mentre dove uscire così:

233x83 9Kb

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Ma l'errore qual'è esattamente? Il fatto che ci sia un nodo padre in meno, la mancanza delle icone (sulle quali sono piuttosto ignorante) o la mancanza dei numeri prima del nome Cirillo Mauro (ma non erano quelli che dovevano sparire e finire nel TAG?)?
E inoltre come ti gira il codice quando ti si verifica l'errore che mi chiarirai: nel Then, o nell'Else?
Tieni conto anche che non ho idea di quali siano i valori di tutto le variabili che usi per comporre il testo del nodo.

trinity Profilo | Guru

ho riscritto tutto:

tenendo presente che il risultato deve essere questo:

202x122 8Kb


e pertanto abbiamo un nodo padre caratterizzato dal numero schedina e un nodofiglio che a sua volta può avere dei ulteriori nodi figli in base ai tuoi suggerimenti ho ricontrollato e testato tutto ed ecco il codice:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

mi funziona!!! secondo te il codice è scritto bene dal punto di vista della sintassi?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Vorrei aggiungere una cosetta. Mi pare che tu stia dimenticando che hai a che fare con degli oggetti. Il metodo che usi per aggiungere il nodo figlio al padre, basato sull'indice, mi pare farraginoso. Risulterebbe più pratico e sicuro un approccio del genere:

Dim Padre As New TreeNode("pippo")
Padre.Tag = "00027/56"
Me.TreeView1.Nodes.Add(Padre)
Dim Figlio As New TreeNode("Pluto")
Padre.Nodes.Add(Figlio)

E scoprirai che sotto il nodo "pippo" appare il sottonodo "pluto" con somma gioia di Walt Disney!

trinity Profilo | Guru

>Vorrei aggiungere una cosetta. Mi pare che tu stia dimenticando
>che hai a che fare con degli oggetti. Il metodo che usi per aggiungere
>il nodo figlio al padre, basato sull'indice, mi pare farraginoso.
>Risulterebbe più pratico e sicuro un approccio del genere:
>
>Dim Padre As New TreeNode("pippo")
> Padre.Tag = "00027/56"
> Me.TreeView1.Nodes.Add(Padre)
> Dim Figlio As New TreeNode("Pluto")
> Padre.Nodes.Add(Figlio)
>
>E scoprirai che sotto il nodo "pippo" appare il sottonodo "pluto"
>con somma gioia di Walt Disney!

ma io su questo codice:

NodoFiglio = New TreeNode(SchedinePSColl.Item(i).CognomeAlloggiato & " " & SchedinePSColl.Item(i).NomeAlloggiato, 1, IndexNodo)

il valore 1 rappresenta quale icona deve caricare e IndexNodo rappresenta quale icona deve selezionare...tieni presente che il codice dopo Else serve ad aggiungere i nodifigli al nodo a cui fanno capo che a sua volta è un nodofiglio...
Utilizzando il codice che mi hai postato ora come esempio come faccio a settare le icone che mi servono? perchè provando mi riporta una sola icona e poi al figlio "pluto" si dovrebbero creare altri figli, come che io nel mio codice li aggiungo così:

NodoFiglio1 = New TreeNode(SchedinePSColl.Item(i).CognomeAlloggiato & " " & SchedinePSColl.Item(i).NomeAlloggiato, 2, IndexNodo)
NodoFiglio.Nodes.Add(NodoFiglio1)
(codice dopo else)

tu come faresti a questo punto?

Ciao

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

alextyx Profilo | Expert

Per quanto mi dici:

"il valore 1 rappresenta quale icona deve caricare e IndexNodo rappresenta quale icona deve selezionare...tieni presente che il codice dopo Else serve ad aggiungere i nodifigli al nodo a cui fanno capo che a sua volta è un nodofiglio...
Utilizzando il codice che mi hai postato ora come esempio come faccio a settare le icone che mi servono? perchè provando mi riporta una sola icona e poi al figlio "pluto" si dovrebbero creare altri figli, come che io nel mio codice li aggiungo così:

NodoFiglio1 = New TreeNode(SchedinePSColl.Item(i).CognomeAlloggiato & " " & SchedinePSColl.Item(i).NomeAlloggiato, 2, IndexNodo)
NodoFiglio.Nodes.Add(NodoFiglio1)
(codice dopo else)

tu come faresti a questo punto?"

La risposta è: Farei grossomodo come te!
Come ti dicevo, non essendomi mai avventurato nelle icone, avevo equivocato l'utilizzo dell'indice.
L'ultimo codice che mi hai postato, sintassi a parte (per la quale il compilatore è moooolto più bravo di me), sembra sostanzialmente andare nella direzione giusta. Se poi ti funziona anche, direi che possiamo finalmente tirare i remi in barca!

trinity Profilo | Guru

Comunque posso solo dirti infinitamente grazie per l'aiuto. Senza di te non sarei mai arrivato al mio risultato. Grazie mille e alla prossima

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
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