Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Text di un nodo di una treeview in colori diversi
Forum - C# / VB.NET - Text di un nodo di una treeview in colori diversi

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
alip1 (Normal User)
Pro


Messaggi: 100
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 10:45
Martedì, 19/10/2021
Buongiorno a tutti.
In vb.net è  possibile in qualche modo assegnare alla proprietà text di una treeview una combinazione di 2 stringhe  ciascuna di colore diverso?
Ad esempio sia TV una treeview e txtcount una stringa
Con TV.tag=" In Scadenza "
txtcount = " - 123 - "
Supponiamo di vole fare qualcosa del genere:
TV.text = TV.tag & txtCount
Il valore text della TV sarà :  In Scadenza -123 -
Ovviamente tutto il valore della TV.text sarà quello previsto.
Ora il mio obiettivo sarebbe quello di poter far vedere - 123 - con un colore diverso diciamo rosso  lasciando il resto col colore previsto.
Spero di essermi spiegato. E' possibile farlo in qualche modo?
Grazie a tutti

Ultima modifica effettuata da alip1 il 19/10/2021 alle 11:00
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1023
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 16:12
Martedì, 19/10/2021
Le proprietà Text di una TreeView, possono avere un colore di primopiano e un colore di fondo.
Nativamente non si possono mescolare i colori in un unica Text.
In VB.Net, il programmatore può intervenire sul disegno di un oggetto, intercettando le funzioni di disegno e cambiandone le proprietà mentre questo viene eseguito, ti devi studiare CustomDraw.

Un esempio https://www.codeproject.com/articles/10483/custom-draw-tree ...

è per il grassetto, ma per i colori è lo stesso.


in programmazione tutto è permesso
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2125
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 12:45
Mercoledì, 20/10/2021
A fare, si può fare di tutto.
Sono controlli customizzati.

In una Treeview ho addirittura inserito delle immagini e una progressabar con delle checkbox.

https://i.ibb.co/2W1vT2g/cattura2.jpg

Non sto a spiegarti tutti i procedimenti, perché la personalizzazione dei controlli è un argomento vastissimo.

Parto dalla cosa più semplice.

Per ottenere quell'effetto sul link esempio che ha postato @Carlo
Viene misurata la lunghezza della stringa in base al font utilizzato, per poi eseguire un DrawText alle giuste coordinate.

Te lo scrivo in C# poi magari te lo traduci con i diversi traduttori online disponibili.

Per prima cosa devi creare un nuovo controllo ereditando la classe TreeView.
In seguito fare un override del DrawNodeItem.

in questo esempio, utilizzando un tag html, tipo <bold>Test</bold> te lo colora di rosso ed in grassetto.
Ma puoi modificare come meglio credi.

Ricordo che è un esempio rozzo, e non completo. Ma che ti serva di spunto per realizzare il tuo controllo.

al testo di un singolo nodo aggiungi esempio

Codice sorgente - presumibilmente Plain Text

  1. " TV Scadenza <bold>123</bold> "




Classe di esempio che ti ho scritto

Codice sorgente - presumibilmente C#

  1. public class treetest : TreeView
  2.     {
  3.  
  4.         public treetest()
  5.         {
  6.             DrawMode = TreeViewDrawMode.OwnerDrawText; //Imposto la modalità di disegno variabile
  7.         }
  8.  
  9.  
  10.        //Agisco al paint del Nodo
  11.         protected override void OnDrawNode(DrawTreeNodeEventArgs e)
  12.         {
  13.             base.OnDrawNode(e);
  14.          
  15.            
  16.             Graphics g = e.Graphics;
  17.  
  18.             Regex regex = new Regex("<bold>(.*)</bold>");
  19.             var v = regex.Match(e.Node.Text);          
  20.             string bold = v.Groups[1].ToString();
  21.  
  22.             var linea = e.Node.Text.Split('<');
  23.             string regular = linea[0];
  24.  
  25.             SizeF regSize = g.MeasureString(regular, Font);
  26.             SizeF boldSize = g.MeasureString(bold, new System.Drawing.Font(Font.FontFamily, Font.Size, FontStyle.Bold));
  27.            
  28.             g.DrawString(linea[0], Font, Brushes.Black, e.Node.Bounds);
  29.             g.DrawString(bold,new Font(Font.FontFamily,Font.Size, FontStyle.Bold), Brushes.Red, new PointF(e.Node.Bounds.X + regSize.Width + 2, e.Node.Bounds.Y));
  30.         }
  31.     }





PM Quote
Avatar
alip1 (Normal User)
Pro


Messaggi: 100
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 11:23
Domenica, 24/10/2021
Testo quotato

Postato originariamente da Thejuster:

A fare, si può fare di tutto.
Sono controlli customizzati.

In una Treeview ho addirittura inserito delle immagini e una progressabar con delle checkbox.

https://i.ibb.co/2W1vT2g/cattura2.jpg

Non sto a spiegarti tutti i procedimenti, perché la personalizzazione dei controlli è un argomento vastissimo.

Parto dalla cosa più semplice.

Per ottenere quell'effetto sul link esempio che ha postato @Carlo
Viene misurata la lunghezza della stringa in base al font utilizzato, per poi eseguire un DrawText alle giuste coordinate.

Te lo scrivo in C# poi magari te lo traduci con i diversi traduttori online disponibili.

Per prima cosa devi creare un nuovo controllo ereditando la classe TreeView.
In seguito fare un override del DrawNodeItem.

in questo esempio, utilizzando un tag html, tipo <bold>Test</bold> te lo colora di rosso ed in grassetto.
Ma puoi modificare come meglio credi.

Ricordo che è un esempio rozzo, e non completo. Ma che ti serva di spunto per realizzare il tuo controllo.

al testo di un singolo nodo aggiungi esempio

Codice sorgente - presumibilmente Plain Text

  1. " TV Scadenza <bold>123</bold> "




Classe di esempio che ti ho scritto

Codice sorgente - presumibilmente C#

  1. public class treetest : TreeView
  2.     {
  3.  
  4.         public treetest()
  5.         {
  6.             DrawMode = TreeViewDrawMode.OwnerDrawText; //Imposto la modalità di disegno variabile
  7.         }
  8.  
  9.  
  10.        //Agisco al paint del Nodo
  11.         protected override void OnDrawNode(DrawTreeNodeEventArgs e)
  12.         {
  13.             base.OnDrawNode(e);
  14.          
  15.            
  16.             Graphics g = e.Graphics;
  17.  
  18.             Regex regex = new Regex("<bold>(.*)</bold>");
  19.             var v = regex.Match(e.Node.Text);          
  20.             string bold = v.Groups[1].ToString();
  21.  
  22.             var linea = e.Node.Text.Split('<');
  23.             string regular = linea[0];
  24.  
  25.             SizeF regSize = g.MeasureString(regular, Font);
  26.             SizeF boldSize = g.MeasureString(bold, new System.Drawing.Font(Font.FontFamily, Font.Size, FontStyle.Bold));
  27.            
  28.             g.DrawString(linea[0], Font, Brushes.Black, e.Node.Bounds);
  29.             g.DrawString(bold,new Font(Font.FontFamily,Font.Size, FontStyle.Bold), Brushes.Red, new PointF(e.Node.Bounds.X + regSize.Width + 2, e.Node.Bounds.Y));
  30.         }
  31.     }






Grazie. Scusami ma una volta realizzata questa classe come faccio a fare in modo che il text di alcuni nodi cambino??? questo passaggio non lo trovo nell'esempio. Grazie per la cortesia.

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2125
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 15:45
Domenica, 24/10/2021
Quando aggiungi uno nodo, alla proprietà Text cioè quando gli da un testo da visualizzare inserisci <bold>Testo</bold>  per colorare ti ho scritto l'esempio....

TV Scadenza <bold>123</bold>


Edit:
PS, è comunque un controllo nuovo, e non devi utilizzare il classico TreeView.
Apparirà a sinistra nella casella degli strumenti dove sono contenuti i controlli, il tuo nuovo controllo chiamato con il nome della classe.
Devi trascinare quello nel form e non il TreeView classico di Visual Studio.


Ultima modifica effettuata da Thejuster il 25/10/2021 alle 9:46


PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1023
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 18:53
Martedì, 26/10/2021
Ciao @alip1.

Nel prossimo post ti allego un progetto VS VB .Net, con una treeview custom, potrai scegliere 2 colori per il testo.

Quando crei il nodo devi inserire la stringa in questo formato:

Treetest1.Nodes.Add(" testo1;testo2; colore1; colore2")

I colori usabili per colore1 o colore2 sono: red, blue, yellow, gray, green
Per discriminare i campi nel testo nel nodo deve essere usato il separatore  ;

Se i colori vengono omessi la stringa non viene stampata, se i colori sono sbagliati viene usato il nero.

Per esempio se si crea il nodo così:
Treetest1.Nodes.Add(" testo1;testo2; ; red")
il testo1 sarà nero e il testo2 sarà rosso

Anche i nodi figli funzioneranno.
Anche se cambi il testo funziona:
Treetest1.Nodes.Item(3).Text = " xx;yy;green ;red "

Qui in allegato una foto del programma test in funzione.
Nel prossimo post lo zip con il progetto e l'eseguibile.


Carlo ha allegato un file: Treeview.png (25266 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da Carlo il 26/10/2021 alle 20:07


in programmazione tutto è permesso
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1023
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 18:59
Martedì, 26/10/2021
Il programma l'ho realizzato usando l'esempio di @Thejuster, ho solo eliminato le regular expression, e corretto alcune visualizzazioni errate che incorrevano se aggiungevi più nodi che portavano a visualizzare i testi in posti sbagliati perché le coordinate non erano ancora disponibili.

Il programma lo puoi modificare a piacere ed aggiungere tutti i colori che vuoi. è in VB .Net


Carlo ha allegato un file: Treeview custom.zip (97567 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Carlo il 26/10/2021 alle 20:07


in programmazione tutto è permesso
PM Quote
Avatar
alip1 (Normal User)
Pro


Messaggi: 100
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 6:23
Mercoledì, 27/10/2021
Grazie Carlo e Grazie a tutti... vedrò i vs suggerimenti e progetti e cercherò di farli miei.
Anche se ho il form già predisposto a livello di progettazione e già con tutti gli eventi e le funzionalità realizzate...
Ho paura ora di togliere la TreeView presa dai controlli e progettata secondo le mie necessità... In verità i nodi sono stati già progettati con tutte le loro caratteristiche icone comprese... e fa parte di un contenitore.. A livello di codice aggiungo dinamicamente solo i nodifigli necessari (presi da una tabella db) ed aggiunti al nodo radice node(0). Dinamicamente agli altri nodi cambio solo la proprietà text a cui aggiungo una stringa del tipo  "- 123 -" e avrei voluto poterla farla vedere in colore rosso e in grassetto..
Ma secondo voi utilizzando l'evento paint della treeview non è proprio possibile farlo utilizzando parzialmente quanto da voi realizzato?
Cmq siete grandi, vorrei saper fare quanto voi.
Grazie di nuovo a tutti

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1023
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 12:06
Mercoledì, 27/10/2021
Fossi in te procederei in questo modo.
1) copia la cartella di progetto in un altro percorso
2) apri il nuovo progetto copiato
3) aggiungi una nuova classe (treetest.vb) sul nuovo progetto, come da mio esempio
4) compila il nuovo progetto per far apparire tra gli strumenti treetest
5) rimuovi dal form la treeview originale
6) trascina nel form treetest
7) apri il vecchio progetto non modificato, in un nuovo VS
8) in progettazione del vecchio progetto, controlla tutte le proprietà della treeview originale
9) sempre in progettazione del nuovo progetto, copia tutte le proprietà della treeview originale in treetest: Name, Location, Size, Anchor, Font, ecc, ecc
10) fai la stessa cosa con gli eventi, iconcina a forma di fulmine nella stessa finestra delle proprietà.
11) lancia il programma e tutto dovrebbe funzionare come prima.

quando vorrai i colori invece di scrivere la stringa .Text = " TV scadenza - 123 -"
scrivi .Text = " TV scadenza;- 123 -;black;red"

Se sei soddisfatto, archivia il vecchio progetto, non lo cancellare.
Se non sei soddisfatto torna al progetto originale.

Ultima modifica effettuata da Carlo il 27/10/2021 alle 12:39


in programmazione tutto è permesso
PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo