27/10/21 10:06
Carlo
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 27/10/21 10:39
in programmazione tutto è permesso
27/10/21 10:50
Thejuster
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
TreeView1.DrawMode = DrawMode.OwnerDrawVariable
AddHandler TreeView1.DrawNode, AddressOf treevie1_drawNode
Crei il relativo overload
Private Sub treevie1_drawNode(ByVal sender As Object, ByVal e As DrawTreeNodeEventArgs)
'Qui il Codice Draw di Carlo
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 27/10/21 10:53
27/10/21 13:14
Carlo
@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.
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
TreeView1.DrawMode = TreeViewDrawMode.OwnerDrawText
AddHandler TreeView1.DrawNode, AddressOf treeview1_drawNode
End Sub
Private Sub treeview1_drawNode(sender As Object, e As DrawTreeNodeEventArgs)
Dim g As Graphics = e.Graphics
Dim colore1 As Brush = Brushes.Black
Dim colore2 As Brush = Brushes.Black
Dim linea = e.Node.Text.Split(";"c)
Dim Size As SizeF
If e.Node.Bounds.X = 0 Then Exit Sub
If linea.GetUpperBound(0) > 1 Then
Select Case linea(2).ToLower().Trim()
Case "red"
colore1 = Brushes.Red
Case "gray"
colore1 = Brushes.Gray
Case "green"
colore1 = Brushes.Green
Case "blue"
colore1 = Brushes.Blue
Case "yellow"
colore1 = Brushes.Gold
Case Else
colore1 = Brushes.Black
End Select
Size = g.MeasureString(linea(0), Font)
g.DrawString(linea(0), Font, colore1, e.Node.Bounds)
End If
If linea.GetUpperBound(0) > 2 Then
Select Case linea(3).ToLower().Trim()
Case "red"
colore2 = Brushes.Red
Case "gray"
colore2 = Brushes.Gray
Case "green"
colore2 = Brushes.Green
Case "blue"
colore2 = Brushes.Blue
Case "yellow"
colore2 = Brushes.Gold
Case Else
colore2 = Brushes.Black
End Select
g.DrawString(linea(1), Font, colore2, e.Node.Bounds.X + Size.Width + 2, e.Node.Bounds.Y)
End If
If linea(0) <> "" And linea.GetUpperBound(0) = 0 Then
g.DrawString(linea(0), Font, colore1, e.Node.Bounds.X, e.Node.Bounds.Y)
End If
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim treeNode1 As New TreeNode("PrimoNodo ")
treeNode1.Nodes.Add(" testo1Verde;testo2Giallo; green; yellow")
treeNode1.Nodes.Add(" testo1Rosso;testo2Blue; red; blue")
treeNode1.Nodes.Add(" testo1nero;testo2Grigio; black; gray")
TreeView1.Nodes.Add(treeNode1)
Dim treeNode2 As New TreeNode("SecondoNodo ")
treeNode2.Nodes.Add(" testo1Verde;testo2Giallo; green; yellow")
treeNode2.Nodes.Add(" testo1Rosso;testo2Blue; red; blue")
treeNode2.Nodes.Add(" testo1nero;testo2Grigio; black; gray")
TreeView1.Nodes.Add(treeNode2)
TreeView1.Nodes.Add(" testoStandard")
TreeView1.Nodes.Add(" testoStandard")
Dim treeNode3 As New TreeNode("TerzoNodo ")
treeNode3.Nodes.Add(" Testo;123; green; red")
treeNode3.Nodes.Add(" Testo;456; green; red")
treeNode3.Nodes.Add(" Testo;789; green; red")
Dim treeNode4 As New TreeNode("QuartoNodo ")
treeNode4.Nodes.Add(" testo1Verde;testo2Giallo; green; yellow")
treeNode4.Nodes.Add(" testo1Rosso;testo2Blue; red; blue")
treeNode4.Nodes.Add(" testo1nero;testo2Grigio; black; gray")
treeNode3.Nodes.Add(treeNode4)
TreeView1.Nodes.Add(treeNode3)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
If TreeView1.Nodes.Count > 3 Then
TreeView1.Nodes.Item(3).Text = " TV scadenza;-123 -;blue;red"
End If
End Sub
End Class
grazie Thejuster.
Ultima modifica effettuata da Carlo 27/10/21 14:10
in programmazione tutto è permesso
27/10/21 14:24
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.
in programmazione tutto è permesso
27/10/21 14:45
alip1
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..
Private Sub TVAtt_drawNode(sender As Object, e As DrawTreeNodeEventArgs)
Dim g As Graphics = e.Graphics
Dim colore1 As Brush = Brushes.Black
Dim colore2 As Brush = Brushes.Black
Dim linea = e.Node.Text.Split(";"c)
Dim Size As SizeF
If e.Node.Bounds.X = 0 Then Exit Sub
If linea.GetUpperBound(0) > 1 Then
Select Case linea(2).ToLower().Trim()
Case "red"
colore1 = Brushes.Red
Case "gray"
colore1 = Brushes.Gray
Case "green"
colore1 = Brushes.Green
Case "blue"
colore1 = Brushes.Blue
Case "yellow"
colore1 = Brushes.Gold
Case Else
colore1 = Brushes.Black
End Select
Size = g.MeasureString(linea(0), Font)
g.DrawString(linea(0), Font, colore1, e.Node.Bounds)
End If
If linea.GetUpperBound(0) > 2 Then
Select Case linea(3).ToLower().Trim()
Case "red"
colore2 = Brushes.Red
Case "gray"
colore2 = Brushes.Gray
Case "green"
colore2 = Brushes.Green
Case "blue"
colore2 = Brushes.Blue
Case "yellow"
colore2 = Brushes.Gold
Case Else
colore2 = Brushes.Black
End Select
g.DrawString(linea(1), Font, colore2, e.Node.Bounds.X + Size.Width + 2, e.Node.Bounds.Y)
End If
If linea(0) <> "" And linea.GetUpperBound(0) = 0 Then
Size = g.MeasureString(linea(0), Font)
g.DrawString(linea(0), Font, colore1, e.Node.Bounds.X, e.Node.Bounds.Y)
End If
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 27/10/21 14:55
aaa
27/10/21 16:15
Carlo
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"
Private Sub TVAtt_drawNode(sender As Object, e As DrawTreeNodeEventArgs)
Dim g As Graphics = e.Graphics
Dim colore1 As Brush = Brushes.Black
Dim colore2 As Brush = Brushes.Black
Dim linea = e.Node.Text.Split(";"c)
Dim Size As SizeF
If e.Node.Bounds.X = 0 Then Exit Sub
If linea.GetUpperBound(0) > 1 Then
Select Case linea(2).ToLower().Trim()
Case "red"
colore1 = Brushes.Red
Case "gray"
colore1 = Brushes.Gray
Case "green"
colore1 = Brushes.Green
Case "blue"
colore1 = Brushes.Blue
Case "yellow"
colore1 = Brushes.Gold
Case Else
colore1 = Brushes.Black
End Select
If linea.GetUpperBound(0) > 2 AndAlso linea(3).ToLower.Trim = "true" Then
Size = g.MeasureString(linea(0), New Font(Font, FontStyle.Bold))
g.DrawString(linea(0), New Font(Font, FontStyle.Bold), colore1, e.Node.Bounds)
Else
Size = g.MeasureString(linea(0), Font)
g.DrawString(linea(0), Font, colore1, e.Node.Bounds)
End If
End If
If linea.GetUpperBound(0) > 3 Then
Select Case linea(4).ToLower().Trim()
Case "red"
colore2 = Brushes.Red
Case "gray"
colore2 = Brushes.Gray
Case "green"
colore2 = Brushes.Green
Case "blue"
colore2 = Brushes.Blue
Case "yellow"
colore2 = Brushes.Gold
Case Else
colore2 = Brushes.Black
End Select
If linea.GetUpperBound(0) > 4 AndAlso linea(5).ToLower.Trim = "true" Then
g.DrawString(linea(1), New Font(Font, FontStyle.Bold), colore2, e.Node.Bounds.X + Size.Width + 2, e.Node.Bounds.Y)
Else
g.DrawString(linea(1), Font, colore2, e.Node.Bounds.X + Size.Width + 2, e.Node.Bounds.Y)
End If
End If
If linea(0) <> "" And linea.GetUpperBound(0) = 0 Then
g.DrawString(linea(0), Font, colore1, e.Node.Bounds.X, e.Node.Bounds.Y)
End If
End Sub
per modificare un nodo:
TreeView1.Nodes.Item(3).Text = " TV scadenza;-123 -;Blue;false;red;true"
Ultima modifica effettuata da Carlo 27/10/21 17:55
in programmazione tutto è permesso