Tristatetreeview

Contenu du snippet

Affichage de 3 états dans un treeview

J'ai effectuer pas mal de recherche et trouver quelques sources, mais aucune permettant d'effectuer cet affichage de maniere simple et efficace
voici les liens visité:
http://www.codeproject.com/KB/cpp/vbnettristatechkbox.aspx
http://www.koders.com/csharp/fid4C53E8F59E2BC3BFABBD77B721C6FDB936CBA62A.aspx
http://69.10.233.10/KB/tree/TriStateTreeViewSubmissio.aspx

Source / Exemple :


Private Sub myTreeView_DrawNode(ByVal sender As Object, ByVal e As DrawTreeNodeEventArgs) Handles TV.DrawNode
        If Me.TV.CheckBoxes Then 'si treenode have chk displayed
            drawnode(e.Node)
            e.DrawDefault = False
        Else
            e.DrawDefault = True
        End If
    End Sub

    Private Sub drawnode(ByVal node As TreeNode, ByVal pic As String) 'draw the node with the appropriate  picture
        Dim nodeFont As Font = node.NodeFont
        If nodeFont Is Nothing Then nodeFont = node.TreeView.Font
        Dim g As Graphics = node.TreeView.CreateGraphics
        g.DrawImage(Me.ImageList1.Images(pic), node.Bounds.Left - 16, node.Bounds.Top)
        If node.IsSelected Then : g.DrawString(node.Text, nodeFont, Brushes.White, node.Bounds.Left, node.Bounds.Top)
        Else : g.DrawString(node.Text, nodeFont, Brushes.Black, node.Bounds.Left, node.Bounds.Top)
        End If
    End Sub
    Private Sub drawnode(ByVal node As TreeNode)
        If Not node.IsVisible Then Return
        If node.Checked Then : drawnode(node, "CheckBoxChecked.bmp")
        Else
            If hasCheckedChild(node) Then : drawnode(node, "CheckBoxCheckedDisabled.bmp")
            Else : drawnode(node, "CheckBox.bmp")
            End If
        End If
        Dim nd As TreeNode = node.Parent
        While nd IsNot Nothing
            TV.Invalidate(nd.Bounds)
            nd = nd.Parent
        End While
    End Sub
    Private Function hasCheckedChild(ByVal nd As TreeNode) As Boolean 'recusrively check if node has checked child
        For Each chnd As TreeNode In nd.Nodes
            If chnd.Checked Then : Return True
            ElseIf hasCheckedChild(chnd) Then : Return True
            End If
        Next
        Return False
    End Function

Conclusion :


avec ces quelques fonctions, cela permet d'afficher facilement les 3 états.

le fct myTreeView_DrawNode handle l'evenement et si, les checkbox sont affichée, effectue l'affichage customisé

la fct drawnode draw la node
la seconde fct drawnode determine quel est l'image appropriée pour le draw

enfin, la fct hasCheckedChild recherche de facon recursive la présence d'une node enfant checkée.

cela pourait être optimisé pour saver cet état et eviter cette fonction récursive, mais cela demande beaucoup de gestion en particulier si on veut faire des drag/drop dans les nodes.

remarque: les trois images sont chargée dans une imagelist

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.