Oppure

Loading
19/10/21 8:45
alip1
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 19/10/21 9:00
aaa
19/10/21 14:12
Carlo
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 codeproject.com/articles/10483/…

è per il grassetto, ma per i colori è lo stesso.
in programmazione tutto è permesso
20/10/21 10:45
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.

i.ibb.co/2W1vT2g/…

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


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




Classe di esempio che ti ho scritto


public class treetest : TreeView
    {

        public treetest()
        {
            DrawMode = TreeViewDrawMode.OwnerDrawText; //Imposto la modalità di disegno variabile
        }


       //Agisco al paint del Nodo
        protected override void OnDrawNode(DrawTreeNodeEventArgs e)
        {
            base.OnDrawNode(e);
         
            
            Graphics g = e.Graphics;

            Regex regex = new Regex("<bold>(.*)</bold>");
            var v = regex.Match(e.Node.Text);           
            string bold = v.Groups[1].ToString();

            var linea = e.Node.Text.Split('<');
            string regular = linea[0];

            SizeF regSize = g.MeasureString(regular, Font);
            SizeF boldSize = g.MeasureString(bold, new System.Drawing.Font(Font.FontFamily, Font.Size, FontStyle.Bold));
           
            g.DrawString(linea[0], Font, Brushes.Black, e.Node.Bounds);
            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));
        }
    }



mire.forumfree.it/ - Mire Engine
C# UI Designer
24/10/21 9:23
alip1
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.

i.ibb.co/2W1vT2g/…

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


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




Classe di esempio che ti ho scritto


public class treetest : TreeView
    {

        public treetest()
        {
            DrawMode = TreeViewDrawMode.OwnerDrawText; //Imposto la modalità di disegno variabile
        }


       //Agisco al paint del Nodo
        protected override void OnDrawNode(DrawTreeNodeEventArgs e)
        {
            base.OnDrawNode(e);
         
            
            Graphics g = e.Graphics;

            Regex regex = new Regex("<bold>(.*)</bold>");
            var v = regex.Match(e.Node.Text);           
            string bold = v.Groups[1].ToString();

            var linea = e.Node.Text.Split('<');
            string regular = linea[0];

            SizeF regSize = g.MeasureString(regular, Font);
            SizeF boldSize = g.MeasureString(bold, new System.Drawing.Font(Font.FontFamily, Font.Size, FontStyle.Bold));
           
            g.DrawString(linea[0], Font, Brushes.Black, e.Node.Bounds);
            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));
        }
    }





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.
aaa
24/10/21 13:45
Thejuster
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 25/10/21 7:46
mire.forumfree.it/ - Mire Engine
C# UI Designer
26/10/21 16:53
Carlo
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.
Ultima modifica effettuata da Carlo 26/10/21 18:07
in programmazione tutto è permesso
26/10/21 16:59
Carlo
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
Ultima modifica effettuata da Carlo 26/10/21 18:07
in programmazione tutto è permesso
27/10/21 4:23
alip1
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
aaa