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.