Oppure

Loading
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
mire.forumfree.it/ - Mire Engine
C# UI Designer
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:09
alip1
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::
aaa
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 14:47
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

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
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