Sur un noeud particulier, la propriété Parent renverra Nothing si c'est le noeud parent de plus haut niveau et la propriété Level renverra 0.
Si c'est pas le noeud parent, la propriété Parent renverra un objet qui le parent direct de ce noeud, et la propriété Level renverra un nombre indiquant le niveau dans la branche depuis le parent de plus haut niveau (1 pour le fils, 2 pour le petit-fils, etc....)
[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Je ne comprend pas pourquoi ça ne marche pas à tous les coups !
C'est une TreeView avec des cases à cocher.
Voici le but (j'ai peur de ne pas me faire comprendre - le mieux c'est de tester le code) :
Lorsqu'on clique sur le Parent on coche tous les enfants non coché.
Lorsqu'on clique sur les enfants un à un jusqu'à arriver au dernier on coche le parent et on change sa couleur de texte.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim objTreeNode As System.Windows.Forms.TreeNode
objTreeNode = TreeView1.Nodes.Add("Test_Parent_1")
objTreeNode.Nodes.Add("Test_Fils_1.1")
objTreeNode.Nodes.Add("Test_Fils_1.2")
objTreeNode.Nodes.Add("Test_Fils_1.3")
objTreeNode.Nodes.Add("Test_Fils_1.4")
objTreeNode.Nodes.Add("Test_Fils_1.5")
objTreeNode.Nodes.Add("Test_Fils_1.6")
objTreeNode.Nodes.Add("Test_Fils_1.7")
objTreeNode = TreeView1.Nodes.Add("Test_Parent_2")
objTreeNode.Nodes.Add("Test_Fils_2.1")
objTreeNode.Nodes.Add("Test_Fils_2.2")
objTreeNode.Nodes.Add("Test_Fils_2.3")
End Sub
Dim blnUncheck As Boolean = True
Private Sub TreeView1_AfterCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck
If e.Node.Parent Is Nothing Then
If (e.Node.Checked) Then
If (blnUncheck = True) Then
CheckedFils(e)
End If
Else
If (blnUncheck = False) Then
unCheckedParent(e)
End If
End If
Else
CheckedParent(e)
End If
End Sub
Private Sub unCheckedParent(ByVal e As System.Windows.Forms.TreeViewEventArgs)
Dim VerifAllChecked As Boolean = False
If e.Node.Parent Is Nothing Then
For Each oChild As TreeNode In e.Node.Nodes
If (oChild.Checked = True) Then
VerifAllChecked = True
End If
Next
End If
If (VerifAllChecked = True) Then
For Each oChild As TreeNode In e.Node.Nodes
oChild.Checked = False
Next
End If
End Sub
Private Sub CheckedFils(ByVal e As System.Windows.Forms.TreeViewEventArgs)
If e.Node.Parent Is Nothing Then
For Each oChild As TreeNode In e.Node.Nodes
If (oChild.Checked = False) Then
oChild.Checked = True
End If
Next
End If
End Sub
Private Sub CheckedParent(ByVal e As System.Windows.Forms.TreeViewEventArgs)
blnUncheck = False
If Not e.Node.Parent Is Nothing Then
For Each child As TreeNode In e.Node.Parent.Nodes
If child.Checked = False Then
blnUncheck = True
End If
Next
If blnUncheck = False Then
e.Node.Parent.Checked = True
ChangeColorParent(e.Node.Parent, True)
Else
e.Node.Parent.Checked = False
ChangeColorParent(e.Node.Parent, False)
End If
End If
End Sub
Private Sub ChangeColorParent(ByVal node As TreeNode, ByVal selected As Boolean)
Dim SelectedFont As New Font(TreeView1.Font, FontStyle.Regular)
node.NodeFont = IIf(selected, SelectedFont, TreeView1.Font)
node.ForeColor = IIf(selected, Color.Green, TreeView1.ForeColor)
If node.Parent IsNot Nothing Then
ChangeColorParent(node.Parent, selected)
End If
End Sub
Il y a un problème dans le déclenchement de l'évènement AfterCheck qui ne se déclenche pas à chaque fois, mais je n'arrive pas à en trouver la cause, ni le moyen de le contourner.
[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Vous n’avez pas trouvé la réponse que vous recherchez ?
Salut
Essayes de simplifier ton code
j'ai écrit autre chose
Private Sub TreeView1_AfterCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck
Dim counter As Integer
'cocher parent
If e.Node.Parent Is Nothing Then
For Each oChild As TreeNode In e.Node.Nodes
If oChild.Checked = False Then
oChild.Checked = True
End If
Next
counter = 0
Else
If e.Node.Parent.Checked = False Then
For Each oChild As TreeNode In e.Node.Parent.Nodes
If oChild.Checked = True Then
counter = counter + 1
If counter = e.Node.Parent.Nodes.Count Then
e.Node.Parent.NodeFont = New Font("arial", 14, FontStyle.Bold, GraphicsUnit.Pixel)
e.Node.Parent.ForeColor = Color.DarkSlateBlue
End If
End If
Next
End If
End If
End Sub
End Class
J'ai été plus collégiale sur ce coup voici ci dessous mon code (pas très beau, mais suffisamment propre pour marcher ) :
J'ai une dernière question sur un TreeView. Peut-on inclure des colonnes et surtout comment (voir exemple) ?
D'avance merci à vous deux.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim objTreeNode As System.Windows.Forms.TreeNode
objTreeNode = TreeView1.Nodes.Add("Test_Parent_1 ")
objTreeNode.Nodes.Add("Test_Fils_1.1")
objTreeNode.Nodes.Add("Test_Fils_1.2")
objTreeNode.Nodes.Add("Test_Fils_1.3")
objTreeNode.Nodes.Add("Test_Fils_1.4")
objTreeNode.Nodes.Add("Test_Fils_1.5")
objTreeNode.Nodes.Add("Test_Fils_1.6")
objTreeNode.Nodes.Add("Test_Fils_1.7")
objTreeNode = TreeView1.Nodes.Add("Test_Parent_2 ")
objTreeNode.Nodes.Add("Test_Fils_2.1")
objTreeNode.Nodes.Add("Test_Fils_2.2")
objTreeNode.Nodes.Add("Test_Fils_2.3") '.Checked = True
VerifAllParent(TreeView1, True, False)
End Sub
Dim nodCurrent As TreeNode
Dim blnUncheck As Boolean = True
Dim VerifAllChecked As Boolean = False
Dim VerifEnfant As Boolean = True
Private Sub TreeView1_AfterCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck
If e.Node.Parent Is Nothing Then
If (e.Node.Checked) Then
If (VerifEnfant = True) Then
CheckFils(e)
VerifAllParent(e, False, False)
End If
Else
If (VerifEnfant = True) Then
unCheckFils(e)
VerifAllParent(e, False, False)
End If
End If
Else
If (VerifEnfant = True) Then
If (e.Node.Checked) Then
CheckParent(e)
Else
unCheckParent(e)
End If
VerifAllParent(e, False, True)
End If
End If
End Sub
Private Sub unCheckParent(ByVal e As System.Windows.Forms.TreeViewEventArgs)
Dim CntEnfantDeselectionne As Boolean = True
For Each child As TreeNode In e.Node.Parent.Nodes
If child.Checked = True Then
CntEnfantDeselectionne = True
End If
Next
If (CntEnfantDeselectionne = True) Then
VerifEnfant = False
e.Node.Parent.Checked = False
End If
CntEnfantDeselectionne = True
VerifEnfant = True
End Sub
Private Sub CheckParent(ByVal e As System.Windows.Forms.TreeViewEventArgs)
Dim CntEnfantDeselectionne As Boolean = False
For Each child As TreeNode In e.Node.Parent.Nodes
If child.Checked = False Then
VerifEnfant = False
CntEnfantDeselectionne = True
End If
Next
If (CntEnfantDeselectionne = False) Then
e.Node.Parent.Checked = True
End If
CntEnfantDeselectionne = False
VerifEnfant = True
End Sub
Private Sub CheckFils(ByVal e As System.Windows.Forms.TreeViewEventArgs)
If e.Node.Parent Is Nothing Then
For Each oChild As TreeNode In e.Node.Nodes
If (oChild.Checked = False) Then
VerifEnfant = False
oChild.Checked = True
End If
Next
VerifEnfant = True
End If
End Sub
Private Sub unCheckFils(ByVal e As System.Windows.Forms.TreeViewEventArgs)
If e.Node.Parent Is Nothing Then
For Each oChild As TreeNode In e.Node.Nodes
If (oChild.Checked = True) Then
VerifEnfant = False
oChild.Checked = False
End If
Next
VerifEnfant = True
End If
End Sub
Private Sub ChangeColorParent(ByVal node As TreeNode, ByVal selected As Boolean, ByVal sColor As Color)
Dim SelectedFont As New Font(TreeView1.Font, FontStyle.Bold)
Dim NotSelectedFont As New Font(TreeView1.Font, FontStyle.Bold)
node.NodeFont = IIf(selected, SelectedFont, NotSelectedFont)
node.ForeColor = IIf(selected, sColor, TreeView1.ForeColor)
If node.Parent IsNot Nothing Then
ChangeColorParent(node.Parent, selected, sColor)
End If
End Sub
Private Sub VerifAllParent(ByVal ObjNodes As Object, ByVal sAll As Boolean, ByVal sEnfant As Boolean)
Dim CntChildChecked As Boolean = False
Dim CntParentChecked As Boolean = False
If (sAll = True) Then
For Each sParent As TreeNode In ObjNodes.Nodes
If (sParent.Checked = False) Then
CntParentChecked = False
For Each child As TreeNode In sParent.Nodes
If (child.Checked = True) Then
CntChildChecked = True
End If
Next
If ((CntParentChecked False) And (CntChildChecked True)) Then
ChangeColorCurrParent(sParent, Color.Orange, 1)
ElseIf ((CntParentChecked False) And (CntChildChecked False)) Then
ChangeColorCurrParent(sParent, Color.Gray, 2)
Else
ChangeColorCurrParent(sParent, Color.Green, 3)
End If
CntChildChecked = False
CntParentChecked = False
End If
Next
Else
If (sEnfant = False) Then
If (ObjNodes.Node.Checked = True) Then
CntParentChecked = True
End If
For Each child As TreeNode In ObjNodes.Node.Nodes
If (child.Checked = True) Then
CntChildChecked = True
End If
Next
If ((CntParentChecked False) And (CntChildChecked True)) Then
ChangeColorCurrParent(ObjNodes.Node, Color.Orange, 1)
ElseIf ((CntParentChecked False) And (CntChildChecked False)) Then
ChangeColorCurrParent(ObjNodes.Node, Color.Gray, 2)
Else
ChangeColorCurrParent(ObjNodes.Node, Color.Green, 3)
End If
Else
If (ObjNodes.Node.Parent.Checked = True) Then
CntParentChecked = True
End If
For Each child As TreeNode In ObjNodes.Node.Parent.Nodes
If (child.Checked = True) Then
CntChildChecked = True
End If
Next
If ((CntParentChecked False) And (CntChildChecked True)) Then
ChangeColorCurrParent(ObjNodes.Node.Parent, Color.Orange, 1)
ElseIf ((CntParentChecked False) And (CntChildChecked False)) Then
ChangeColorCurrParent(ObjNodes.Node.Parent, Color.Gray, 2)
Else
ChangeColorCurrParent(ObjNodes.Node.Parent, Color.Green, 3)
End If
End If
CntChildChecked = False
CntParentChecked = False
End If
End Sub
Private Sub ChangeColorCurrParent(ByVal node As TreeNode, ByVal sColor As Color, ByVal sSituation As Integer)
Dim SelectedFont As New Font(TreeView1.Font, FontStyle.Bold)
node.NodeFont = IIf(True, SelectedFont, SelectedFont)
node.ForeColor = IIf(True, sColor, TreeView1.ForeColor)
Dim TextNoeud As String = node.Text
TextNoeud = Replace(TextNoeud, "- Complet", "")
TextNoeud = Replace(TextNoeud, "- Vide", "")
TextNoeud = Replace(TextNoeud, "- Incomplet", "")
Select Case sSituation
Case 1
node.Text = TextNoeud + "- Incomplet"
Case 2
node.Text = TextNoeud + "- Vide"
Case 3
node.Text = TextNoeud + "- Complet"
End Select
End Sub