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 - Text di un nodo di una treeview in colori diversi
Forum - C# / VB.NET - Text di un nodo di una treeview in colori diversi - Pagina 2

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 12:50
Mercoledì, 27/10/2021
in alternativa copia tutto il codice di Carlo, contenuto nel metodo OnDrawNode.
(o in seguito se manca qualche variabile o funzione la aggiungi manualmente. )

all'evento form load, aggiungi

Codice sorgente - presumibilmente C# / VB.NET

  1. TreeView1.DrawMode = DrawMode.OwnerDrawVariable
  2. AddHandler TreeView1.DrawNode, AddressOf treevie1_drawNode



Crei il relativo overload

Codice sorgente - presumibilmente VB.NET

  1. Private Sub treevie1_drawNode(ByVal sender As Object, ByVal e As DrawTreeNodeEventArgs)
  2.  
  3. 'Qui il Codice Draw di Carlo
  4.  
  5. End Sub




Così andrai a modificare il draw della TreeView Già esistente senza crearne una nuova.

Chiedo scusa in caso di errori ma il Vb mi sta proprio antipatico e macchinoso.


Ultima modifica effettuata da Thejuster il 27/10/2021 alle 12:53


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 15:14
Mercoledì, 27/10/2021
@Thejuster @alip1

non avevo mai usato DrawMode in un controllo standard, e ho provato funziona, il codice completo in VB.Net
Nel form va aggiunta una TreeView e due bottoni.

Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  3.         TreeView1.DrawMode = TreeViewDrawMode.OwnerDrawText
  4.         AddHandler TreeView1.DrawNode, AddressOf treeview1_drawNode
  5.     End Sub
  6.  
  7.     Private Sub treeview1_drawNode(sender As Object, e As DrawTreeNodeEventArgs)
  8.  
  9.         Dim g As Graphics = e.Graphics
  10.         Dim colore1 As Brush = Brushes.Black
  11.         Dim colore2 As Brush = Brushes.Black
  12.         Dim linea = e.Node.Text.Split(";"c)
  13.         Dim Size As SizeF
  14.  
  15.         If e.Node.Bounds.X = 0 Then Exit Sub
  16.  
  17.         If linea.GetUpperBound(0) > 1 Then
  18.             Select Case linea(2).ToLower().Trim()
  19.                 Case "red"
  20.                     colore1 = Brushes.Red
  21.  
  22.                 Case "gray"
  23.                     colore1 = Brushes.Gray
  24.  
  25.                 Case "green"
  26.                     colore1 = Brushes.Green
  27.  
  28.                 Case "blue"
  29.                     colore1 = Brushes.Blue
  30.  
  31.                 Case "yellow"
  32.                     colore1 = Brushes.Gold
  33.  
  34.                 Case Else
  35.                     colore1 = Brushes.Black
  36.             End Select
  37.             Size = g.MeasureString(linea(0), Font)
  38.             g.DrawString(linea(0), Font, colore1, e.Node.Bounds)
  39.         End If
  40.  
  41.         If linea.GetUpperBound(0) > 2 Then
  42.             Select Case linea(3).ToLower().Trim()
  43.                 Case "red"
  44.                     colore2 = Brushes.Red
  45.  
  46.                 Case "gray"
  47.                     colore2 = Brushes.Gray
  48.  
  49.                 Case "green"
  50.                     colore2 = Brushes.Green
  51.  
  52.                 Case "blue"
  53.                     colore2 = Brushes.Blue
  54.  
  55.                 Case "yellow"
  56.                     colore2 = Brushes.Gold
  57.  
  58.                 Case Else
  59.                     colore2 = Brushes.Black
  60.             End Select
  61.             g.DrawString(linea(1), Font, colore2, e.Node.Bounds.X + Size.Width + 2, e.Node.Bounds.Y)
  62.         End If
  63.  
  64.         If linea(0) <> "" And linea.GetUpperBound(0) = 0 Then
  65.             g.DrawString(linea(0), Font, colore1, e.Node.Bounds.X, e.Node.Bounds.Y)
  66.         End If
  67.     End Sub
  68.  
  69.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  70.         Dim treeNode1 As New TreeNode("PrimoNodo ")
  71.         treeNode1.Nodes.Add(" testo1Verde;testo2Giallo; green; yellow")
  72.         treeNode1.Nodes.Add(" testo1Rosso;testo2Blue; red; blue")
  73.         treeNode1.Nodes.Add(" testo1nero;testo2Grigio; black; gray")
  74.         TreeView1.Nodes.Add(treeNode1)
  75.  
  76.         Dim treeNode2 As New TreeNode("SecondoNodo ")
  77.         treeNode2.Nodes.Add(" testo1Verde;testo2Giallo; green; yellow")
  78.         treeNode2.Nodes.Add(" testo1Rosso;testo2Blue; red; blue")
  79.         treeNode2.Nodes.Add(" testo1nero;testo2Grigio; black; gray")
  80.         TreeView1.Nodes.Add(treeNode2)
  81.  
  82.         TreeView1.Nodes.Add(" testoStandard")
  83.         TreeView1.Nodes.Add(" testoStandard")
  84.  
  85.         Dim treeNode3 As New TreeNode("TerzoNodo ")
  86.         treeNode3.Nodes.Add(" Testo;123; green; red")
  87.         treeNode3.Nodes.Add(" Testo;456; green; red")
  88.         treeNode3.Nodes.Add(" Testo;789; green; red")
  89.         Dim treeNode4 As New TreeNode("QuartoNodo ")
  90.         treeNode4.Nodes.Add(" testo1Verde;testo2Giallo; green; yellow")
  91.         treeNode4.Nodes.Add(" testo1Rosso;testo2Blue; red; blue")
  92.         treeNode4.Nodes.Add(" testo1nero;testo2Grigio; black; gray")
  93.         treeNode3.Nodes.Add(treeNode4)
  94.         TreeView1.Nodes.Add(treeNode3)
  95.     End Sub
  96.  
  97.     Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  98.         If TreeView1.Nodes.Count > 3 Then
  99.             TreeView1.Nodes.Item(3).Text = " TV scadenza;-123 -;blue;red"
  100.         End If
  101.     End Sub
  102. End Class



grazie Thejuster.

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


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


Messaggi: 139
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 16:09
Mercoledì, 27/10/2021
Grazie ma veramente grazie a tutti... non sapevo proprio come fare e cosa fosse possibile...

un'ultima cosa alla stringa di Carlo: tv.nodes(i).text=" Testo;123; green; red" é possibile dirgli anche che il testo "- 123 -" sia in formato bold?? Forse sto proprio chiedendo troppo!!:pat::

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 16:24
Mercoledì, 27/10/2021
Dipende, se vuoi un colore solo puoi tornare all'esempio originale con le Regex.
Oppure si possono allungare i parametri separati da ;

TreeView1.Nodes.Item(3).Text = " TV scadenza;-123 -;blue;false;red;true"

dove: "TV scadenza" sarebbe scritto in blu nonbold (false)
e: "-123 -"  sarebbe scritto in rosso bold (true)

Sul codice nel vettore linea troverai:
linea(0)  la prima stringa
linea(1)  la seconda stringa
linea(2)  colore della prima stringa (red, yellow, green, blue, red, gray)
linea(3)  boldatura prima stringa (true or false)
linea(4)  colore della seconda stringa (red, yellow, green, blue, red, gray)
linea(5)  boldatura seconda stringa (true or false)

Con queste info, il codice deve essere modificato di conseguenza, prova o chiedi.



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


Messaggi: 139
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 16:45
Mercoledì, 27/10/2021
Testo quotato

Postato originariamente da Carlo:

Dipende, se vuoi un colore solo puoi tornare all'esempio originale con le Regex.
Oppure si possono allungare i parametri separati da ;

TreeView1.Nodes.Item(3).Text = " TV scadenza;-123 -;blue;false;red;true"

dove: "TV scadenza" sarebbe scritto in blu nonbold (false)
e: "-123 -"  sarebbe scritto in rosso bold (true)

Sul codice nel vettore linea troverai:
linea(0)  la prima stringa
linea(1)  la seconda stringa
linea(2)  colore della prima stringa (red, yellow, green, blue, red, gray)
linea(3)  boldatura prima stringa (true or false)
linea(4)  colore della seconda stringa (red, yellow, green, blue, red, gray)
linea(5)  boldatura seconda stringa (true or false)

Con queste info, il codice deve essere modificato di conseguenza, prova o chiedi.




Grazie Carlo per ora ho risolto pienamente i due colori realizzando l'evento drawmode ed utilizzando il tuo codice fantastico..
Codice sorgente - presumibilmente VB.NET

  1. Private Sub TVAtt_drawNode(sender As Object, e As DrawTreeNodeEventArgs)
  2.  
  3.       Dim g As Graphics = e.Graphics
  4.       Dim colore1 As Brush = Brushes.Black
  5.       Dim colore2 As Brush = Brushes.Black
  6.       Dim linea = e.Node.Text.Split(";"c)
  7.       Dim Size As SizeF
  8.  
  9.       If e.Node.Bounds.X = 0 Then Exit Sub
  10.  
  11.       If linea.GetUpperBound(0) > 1 Then
  12.          Select Case linea(2).ToLower().Trim()
  13.             Case "red"
  14.                colore1 = Brushes.Red
  15.  
  16.             Case "gray"
  17.                colore1 = Brushes.Gray
  18.  
  19.             Case "green"
  20.                colore1 = Brushes.Green
  21.  
  22.             Case "blue"
  23.                colore1 = Brushes.Blue
  24.  
  25.             Case "yellow"
  26.                colore1 = Brushes.Gold
  27.  
  28.             Case Else
  29.                colore1 = Brushes.Black
  30.          End Select
  31.          Size = g.MeasureString(linea(0), Font)
  32.          g.DrawString(linea(0), Font, colore1, e.Node.Bounds)
  33.       End If
  34.  
  35.       If linea.GetUpperBound(0) > 2 Then
  36.          Select Case linea(3).ToLower().Trim()
  37.             Case "red"
  38.                colore2 = Brushes.Red
  39.  
  40.             Case "gray"
  41.                colore2 = Brushes.Gray
  42.  
  43.             Case "green"
  44.                colore2 = Brushes.Green
  45.  
  46.             Case "blue"
  47.                colore2 = Brushes.Blue
  48.  
  49.             Case "yellow"
  50.                colore2 = Brushes.Gold
  51.  
  52.             Case Else
  53.                colore2 = Brushes.Black
  54.          End Select
  55.          g.DrawString(linea(1), Font, colore2, e.Node.Bounds.X + Size.Width + 2, e.Node.Bounds.Y)
  56.       End If
  57.  
  58.       If linea(0) <> "" And linea.GetUpperBound(0) = 0 Then
  59.          Size = g.MeasureString(linea(0), Font)
  60.          g.DrawString(linea(0), Font, colore1, e.Node.Bounds.X, e.Node.Bounds.Y)
  61.       End If
  62.    End Sub


volendo fare come dici tu utilizzando la linea(3) e la linea(5) per il bold (True o False)  credo che andrebbe passato al font?? ma non me lo prende!! mi dice proprietà readonly..
Grazie di nuovo

Ultima modifica effettuata da alip1 il 27/10/2021 alle 16:55
PM Quote
Avatar
alip1 (Normal User)
Pro


Messaggi: 139
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 16:47
Mercoledì, 27/10/2021
Testo quotato

Postato originariamente da Carlo:

Dipende, se vuoi un colore solo puoi tornare all'esempio originale con le Regex.
Oppure si possono allungare i parametri separati da ;

TreeView1.Nodes.Item(3).Text = " TV scadenza;-123 -;blue;false;red;true"

dove: "TV scadenza" sarebbe scritto in blu nonbold (false)
e: "-123 -"  sarebbe scritto in rosso bold (true)

Sul codice nel vettore linea troverai:
linea(0)  la prima stringa
linea(1)  la seconda stringa
linea(2)  colore della prima stringa (red, yellow, green, blue, red, gray)
linea(3)  boldatura prima stringa (true or false)
linea(4)  colore della seconda stringa (red, yellow, green, blue, red, gray)
linea(5)  boldatura seconda stringa (true or false)

Con queste info, il codice deve essere modificato di conseguenza, prova o chiedi.




Grazie Carlo per ora ho risolto pienamente i due colori realizzando l'evento drawmode ed utilizzando il tuo codice fantastico..
Codice sorgente - presumibilmente VB.NET

  1. Private Sub TVAtt_drawNode(sender As Object, e As DrawTreeNodeEventArgs)
  2.  
  3.       Dim g As Graphics = e.Graphics
  4.       Dim colore1 As Brush = Brushes.Black
  5.       Dim colore2 As Brush = Brushes.Black
  6.       Dim linea = e.Node.Text.Split(";"c)
  7.       Dim Size As SizeF
  8.  
  9.       If e.Node.Bounds.X = 0 Then Exit Sub
  10.  
  11.       If linea.GetUpperBound(0) > 1 Then
  12.          Select Case linea(2).ToLower().Trim()
  13.             Case "red"
  14.                colore1 = Brushes.Red
  15.  
  16.             Case "gray"
  17.                colore1 = Brushes.Gray
  18.  
  19.             Case "green"
  20.                colore1 = Brushes.Green
  21.  
  22.             Case "blue"
  23.                colore1 = Brushes.Blue
  24.  
  25.             Case "yellow"
  26.                colore1 = Brushes.Gold
  27.  
  28.             Case Else
  29.                colore1 = Brushes.Black
  30.          End Select
  31.          Size = g.MeasureString(linea(0), Font)
  32.          g.DrawString(linea(0), Font, colore1, e.Node.Bounds)
  33.       End If
  34.  
  35.       If linea.GetUpperBound(0) > 2 Then
  36.          Select Case linea(3).ToLower().Trim()
  37.             Case "red"
  38.                colore2 = Brushes.Red
  39.  
  40.             Case "gray"
  41.                colore2 = Brushes.Gray
  42.  
  43.             Case "green"
  44.                colore2 = Brushes.Green
  45.  
  46.             Case "blue"
  47.                colore2 = Brushes.Blue
  48.  
  49.             Case "yellow"
  50.                colore2 = Brushes.Gold
  51.  
  52.             Case Else
  53.                colore2 = Brushes.Black
  54.          End Select
  55.          g.DrawString(linea(1), Font, colore2, e.Node.Bounds.X + Size.Width + 2, e.Node.Bounds.Y)
  56.       End If
  57.  
  58.       If linea(0) <> "" And linea.GetUpperBound(0) = 0 Then
  59.          Size = g.MeasureString(linea(0), Font)
  60.          g.DrawString(linea(0), Font, colore1, e.Node.Bounds.X, e.Node.Bounds.Y)
  61.       End If
  62.    End Sub


ma mi sembra che linea ha solo 4 elementi e non sei ... per cui volendo fare come dici tu utilizzando la linea(3) e la linea(5) per il bold (True o False)   credo che andrebbe passato al font?? ma non me lo prende!! credo che andrebbero cambiate anche gli indici delle linee essendo diverse.
Grazie di nuovo

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 18:15
Mercoledì, 27/10/2021
Devi ringraziare Thejuster, io non ci avrei pensato a fare l'override del controllo standard.

Il vettore linea, si autodimensiona in base alla stringa che passi, ogni punto e virgola crea una dimensione, l'ordine di inserimento è a tua cura, l'unica cosa da tenere presente è che la prima stringa deve essere quella principale, in modo che il controllo funzioni anche se viene usato in modo tradizionale.

Questo codice gestisce il bold su ambedue i testi.
tutto come prima ma la nuova stringa non è compatibile con il vecchio codice:
TreeView1.Nodes.Add(" testo1;testo2;colore1;statobold1;colore2;statobold2")


Codice sorgente - presumibilmente VB.NET

  1. Private Sub TVAtt_drawNode(sender As Object, e As DrawTreeNodeEventArgs)
  2.  
  3.         Dim g As Graphics = e.Graphics
  4.         Dim colore1 As Brush = Brushes.Black
  5.         Dim colore2 As Brush = Brushes.Black
  6.         Dim linea = e.Node.Text.Split(";"c)
  7.         Dim Size As SizeF
  8.  
  9.         If e.Node.Bounds.X = 0 Then Exit Sub
  10.  
  11.         If linea.GetUpperBound(0) > 1 Then
  12.             Select Case linea(2).ToLower().Trim()
  13.                 Case "red"
  14.                     colore1 = Brushes.Red
  15.  
  16.                 Case "gray"
  17.                     colore1 = Brushes.Gray
  18.  
  19.                 Case "green"
  20.                     colore1 = Brushes.Green
  21.  
  22.                 Case "blue"
  23.                     colore1 = Brushes.Blue
  24.  
  25.                 Case "yellow"
  26.                     colore1 = Brushes.Gold
  27.  
  28.                 Case Else
  29.                     colore1 = Brushes.Black
  30.             End Select
  31.             If linea.GetUpperBound(0) > 2 AndAlso linea(3).ToLower.Trim = "true" Then
  32.                 Size = g.MeasureString(linea(0), New Font(Font, FontStyle.Bold))
  33.                 g.DrawString(linea(0), New Font(Font, FontStyle.Bold), colore1, e.Node.Bounds)
  34.             Else
  35.                 Size = g.MeasureString(linea(0), Font)
  36.                 g.DrawString(linea(0), Font, colore1, e.Node.Bounds)
  37.             End If
  38.         End If
  39.  
  40.         If linea.GetUpperBound(0) > 3 Then
  41.             Select Case linea(4).ToLower().Trim()
  42.                 Case "red"
  43.                     colore2 = Brushes.Red
  44.  
  45.                 Case "gray"
  46.                     colore2 = Brushes.Gray
  47.  
  48.                 Case "green"
  49.                     colore2 = Brushes.Green
  50.  
  51.                 Case "blue"
  52.                     colore2 = Brushes.Blue
  53.  
  54.                 Case "yellow"
  55.                     colore2 = Brushes.Gold
  56.  
  57.                 Case Else
  58.                     colore2 = Brushes.Black
  59.             End Select
  60.             If linea.GetUpperBound(0) > 4 AndAlso linea(5).ToLower.Trim = "true" Then
  61.                 g.DrawString(linea(1), New Font(Font, FontStyle.Bold), colore2, e.Node.Bounds.X + Size.Width + 2, e.Node.Bounds.Y)
  62.             Else
  63.                 g.DrawString(linea(1), Font, colore2, e.Node.Bounds.X + Size.Width + 2, e.Node.Bounds.Y)
  64.             End If
  65.         End If
  66.  
  67.         If linea(0) <> "" And linea.GetUpperBound(0) = 0 Then
  68.             g.DrawString(linea(0), Font, colore1, e.Node.Bounds.X, e.Node.Bounds.Y)
  69.         End If
  70.     End Sub



per modificare un nodo:
TreeView1.Nodes.Item(3).Text = " TV scadenza;-123 -;Blue;false;red;true"

Ultima modifica effettuata da Carlo il 27/10/2021 alle 19:55


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


Messaggi: 139
Iscritto: 12/08/2019

Segnala al moderatore
Postato alle 9:23
Giovedì, 28/10/2021
Grazie fantastico... mi hai insegnato in un attimo tantissimo veramente grazie a te ma anche agli altri..

Marco scusami volevo farti una ultima domanda ( spero l'ultima):
nella linea di codice (e ovviamente anche nelle altre)
Codice sorgente - presumibilmente C# / VB.NET

  1. g.DrawString(linea(0), New Font(Font, FontStyle.Bold), colore1, e.Node.Bounds)



l'oggetto Font che passi a New Font(Font,...) a quale font si riferisce a quello impostato in progettazione alla TVAtt o ad un font generico.. nel caso potrei scrivere così:
Codice sorgente - presumibilmente C# / VB.NET

  1. g.DrawString(linea(0), New Font(TVATT.Font, FontStyle.Bold), colore1, e.Node.Bounds)



Di nuovo grazie 1000

PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo