Oppure

Loading
29/10/21 11:44
Carlo
La motivazione della differenza che hai rispetto alla mia visualizzazione potrebbe risiedere nella combinazione dei colori del S.O.
Ma i colori li puoi scegliere tu e mettere quelli che meglio risaltano.

Per cambiare il colore del testo selezionato le possibilità sono molteplici, restando nella tipologia scelta è sufficiente al redraw della TreeView controllare se il testo in visualizzazione è selezionato, e scegliere un colore adeguato, anche lo sfondo della selezione può essere colorato a piacere.

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TVAtt.DrawMode = TreeViewDrawMode.OwnerDrawText
        AddHandler TVAtt.DrawNode, AddressOf TVAtt_drawNode
        TVAtt.BackColor = Color.White
        TVAtt.LineColor = Color.Gray
        TVAtt.ForeColor = Color.Black
        TVAtt.HideSelection = False ' la selezione sarà visible anche quando la Treeview o il form perde il fuoco
    End Sub

    Private Sub TVAtt_drawNode(sender As Object, e As DrawTreeNodeEventArgs)

        If e.Node Is Nothing Then Return
        Dim selected As Boolean = e.State And TreeNodeStates.Selected
        Dim g As Graphics = e.Graphics
        Dim colore1 As Brush = New SolidBrush(TVAtt.ForeColor)
        Dim colore2 As Brush = New SolidBrush(TVAtt.ForeColor)
        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.RoyalBlue

                Case "yellow"
                    colore1 = Brushes.Gold

                Case "cyan"
                    colore1 = Brushes.DarkCyan

                Case "magen"
                    colore1 = Brushes.Magenta

                Case "orange"
                    colore1 = Brushes.Orange

                Case Else
                    colore1 = New SolidBrush(TVAtt.ForeColor)
            End Select
            If selected Then
                colore1 = New SolidBrush(Color.White) ' colore del testo1 se selezionato
                ' colore di fondo della selezione
                e.Graphics.FillRectangle(Brushes.DarkBlue, e.Node.Bounds)
            End If
            If linea.GetUpperBound(0) > 2 AndAlso linea(3).ToLower.Trim = "true" Then
                Size = g.MeasureString(linea(0), New Font(TVAtt.Font, FontStyle.Bold))
                g.DrawString(linea(0), New Font(TVAtt.Font, FontStyle.Bold), colore1, e.Node.Bounds)
            Else
                Size = g.MeasureString(linea(0), TVAtt.Font)
                g.DrawString(linea(0), TVAtt.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.RoyalBlue

                Case "yellow"
                    colore2 = Brushes.Gold

                Case "cyan"
                    colore2 = Brushes.DarkCyan

                Case "magen"
                    colore2 = Brushes.Magenta

                Case "orange"
                    colore2 = Brushes.Orange

                Case Else
                    colore2 = New SolidBrush(TVAtt.ForeColor)
            End Select
            If selected Then colore2 = New SolidBrush(Color.White) ' colore del testo2 se selezionato
            If linea.GetUpperBound(0) > 4 AndAlso linea(5).ToLower.Trim = "true" Then
                g.DrawString(linea(1), New Font(TVAtt.Font, FontStyle.Bold), colore2, e.Node.Bounds.X + Size.Width + 2, e.Node.Bounds.Y)
            Else
                g.DrawString(linea(1), TVAtt.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
            e.DrawDefault = True
        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(" testo1Arancio;testo2Giallo;orange;true;yellow;true")
        treeNode1.Nodes.Add(" testo1Rosso;testo2Blue;red;;blue;true")
        treeNode1.Nodes.Add(" testo1Nero;testo2Grigio;black;true;gray;")
        TVAtt.Nodes.Add(treeNode1)

        Dim treeNode2 As New TreeNode("SecondoNodo ")
        treeNode2.Nodes.Add(" testo1Verde;testo2Giallo;green;;yellow;")
        treeNode2.Nodes.Add(" testo1Rosso;testo2Blue;red;true;blue;")
        treeNode2.Nodes.Add(" testo1Nero;testo2Grigio;black;;gray;true")
        TVAtt.Nodes.Add(treeNode2)

        TVAtt.Nodes.Add(" testoStandard")
        TVAtt.Nodes.Add(" testoStandard")

        Dim treeNode3 As New TreeNode("TerzoNodo ")
        treeNode3.Nodes.Add(" Testo;123;cyan;;red;")
        treeNode3.Nodes.Add(" Testo;456;cyan;;red;True")
        treeNode3.Nodes.Add(" Testo;789;cyan;;red;True")
        Dim treeNode4 As New TreeNode("QuartoNodo ")
        treeNode4.Nodes.Add(" testo1Verde;testo2Giallo;green;true;yellow;true")
        treeNode4.Nodes.Add(" testo1Rosso;testo2Nero;red;;black;true")
        treeNode4.Nodes.Add(" testo1Magenta;testo2Arancio;magen;true;orange;")
        treeNode3.Nodes.Add(treeNode4)
        TVAtt.Nodes.Add(treeNode3)
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        If TVAtt.Nodes.Count > 2 Then
            TVAtt.Nodes.Item(3).Text = " TV scadenza;-123-;green;;red;true"
        End If
    End Sub
End Class


alla riga 53 e alla riga 95, i colori che il testo deve avere se selezionato
alla riga 55 traccio un rettangolo pieno che da il colore di fondo della selezione dei soli testi colorati
la riga 55 se omessa, il colore di fondo della selezione sarà quello di default (dipende da win)
Ultima modifica effettuata da Carlo 29/10/21 12:28
in programmazione tutto è permesso
29/10/21 13:35
alip1
Fantastico... Grazie Marco.
un'ultimissima cosa ma spero proprio l'ultima.
il mio primo nodo indice 0 ha tre sottonodi.. se non clicco sul nodo i sottonodi non si vedono vorrei poterli farli vedere subito.
tieni presente che tutti i nodi sono già realizzati a livello di progettazione mentre a livello di codice al load del form carico i sottonodi del nodo di indice 0 ( e i sotto nodi possono essere anche + di 1)
ora dopo averli caricati ho fatto così:
TVAtt.Nodes(0).Text = "Di Gruppo; ;white;true;white;true"
         TVAtt.Nodes(0).ExpandAll()

ma il nodo rimane non espanso e nemmeno il colore di selezione bianco su blu si realizza. Quando clicco sul nodo è tutto ok.
Secondo te come mai il nodo non si espande? Ho controllato la proprietà expanded del nodo e risulta true ma il nodo rimane chiuso.
Grazie come sempre.:pat:
aaa
29/10/21 14:00
Carlo
Non so se quando ti riferisci a Marco, ti riferisci a me.

A me funziona, prova anche questa per espandere il primo nodo:

TVAtt.Nodes.Item(0).Expand()

hai provato a lanciare l'istruzione con un button, per essere certo che non venga eseguita troppo presto?
prova ad inserire application.doevents

TVAtt.Nodes.Item(0).Text = " TV scadenza;-123-;green;;red;true"
Application.DoEvents()
TVAtt.Nodes.Item(0).Expand()
Ultima modifica effettuata da Carlo 29/10/21 14:09
in programmazione tutto è permesso
29/10/21 14:09
alip1
Scusami Carlo é che ho un nipotino di nome Marco... :pat:
Ultima modifica effettuata da alip1 29/10/21 14:10
aaa
29/10/21 17:24
alip1
Postato originariamente da Carlo:

Non so se quando ti riferisci a Marco, ti riferisci a me.

A me funziona, prova anche questa per espandere il primo nodo:

TVAtt.Nodes.Item(0).Expand()

hai provato a lanciare l'istruzione con un button, per essere certo che non venga eseguita troppo presto?
prova ad inserire application.doevents

TVAtt.Nodes.Item(0).Text = " TV scadenza;-123-;green;;red;true"
Application.DoEvents()
TVAtt.Nodes.Item(0).Expand()

Grazie Carlo
ho fatto come dici ma il nodo rimane non espanso a meno che non faccio cli col mouse sul nodo.. non capisco perché il nodo risulta ache con isselected=true
aaa
29/10/21 18:01
Carlo
se lo fai nel mio esempio funziona?
in programmazione tutto è permesso
31/10/21 18:37
alip1
Grazie Carlo
Si in effetti nel tuo mi funziona non so nel mio perché no. Devo capire in quale momento devo farlo, perché in pratica il TVAtt é realizzato in sede di progetto.
A livello di codice carico i sottonodi del primo nodo radice (indice 0) e questo è l'unico che di fatto ha sotto nodi.
Poi carico i dati dal db calcolo i valori a seconda dei filtri che verranno operati e quindi si posiziona sul nodo di indice 0 e visualizza i dati relativi nella listview a lato ..il fatto é che pur posizionando su primo nodo vorrei che esso si espandesse perché l'utente possa vedere i nodi sottostanti senza dover cliccare sul nodo per espanderlo...
Vedrò di capire, non vorrei che andasse settata qualche altra proprietà che non so..
Comunque grazie a te e a Thejuster ho imparato tantissimo.. grazie di nuovo
un buon lavoro a tutti voi
aaa
02/11/21 10:08
alip1
Problematica risolta...
avevo lasciato in giro un collapse che avveniva dopo l'espand... per cui il nodo si chiudeva:pat:
Grazie a tutti voi per quanto mi avete insegnato sulla TreeView
Buon Lavoro a tutti
aaa